关于单向链表的反转想必大家都很熟了,以前一直用递归的方法写的,还是挺好写的,但是后来又在网上瞄了一眼非递归方法的实现,当时以为那个代码是正确的,也没验证,后来就不了了之。
昨天下午开始写这个代码,最后老发现出问题,今天早上起来理了一遍,终于发现症结所在。
举个例子吧:
1->2->3->4->5->6 我反转后的结果应该是: 6->5->4->3->2->1
我的算法是这样的(语死早,大家不要笑,我就用过程图表达吧):
1->2->3->4->5->6
2->1->3->4->5->6
3->2->1->4->5->6
4->3->2->1->5->6
5->4->3->2->1->6
6->5->4->3->2->1
其实整个过程不复杂,但是吧,之前一直没把图画出来,理所当然的在空想,我把我的感触写下来吧:
1:注意1这个位置,这个位置起着连接后面未操作的数据的作用,相当重要,这是我之前代码一直出问题的原因
2:注意每次头结点的变化
3:到最后的时候尾节点变成了1位置的节点
好了,放代码了,新手写代码,大家请多多指教O(∩_∩)O哈!
struct Node // 结点结构
{
int m_data;
Node* m_next;
};
struct List // 单向链表结构
{
Node* m_head;
Node* m_tail;
size_t m_length;
};
// 单向链表反转
Node* first = m_head; // 两个待交换结点的第一个结点
Node* second = m_head->m_next; // 两个待交换结点的第二个结点
Node* next = second->m_next; // 下一个要交换的节点
Node* last = m_head; // 存放上面的“1”对应的节点
//以下是第一次交换,是第一个结点和第二个结点的交换
second->m_next = first; // 后面的节点改变指向指向前面的节点
first->m_next = next; // 前面的节点改变指向,指向下一个要交换的节点
first = second; // 这一行和下一行做的操作就是把后面的节点和下一个要交换的节点放到first和second中用来操作
second = next;
next = next->m_next; //下下个要交换的节点
while(second != NULL)
{
second->m_next = first; // 同上面的注释
last->m_next = next; //这一块就比较坑啦,大家要注意看我上面的图中1所在的位置,是1在不停地往后走,first对应的数据其实它的后结点是不会变了
first = second; // 上面已经有注释
second = next;
if (next != NULL)
{
next = next->m_next;
}
}
m_head = first;
m_tail = last;
哎,我这表达能力啊,太捉急了,不过总算是写完了。。。谢谢大家捧场。
原文地址:http://www.cnblogs.com/yhf19900326/p/3809648.html