题目:
将单链表进行反转。比如链表为:1->2->3->4,反转之后为:4->3->2->1
分析:
用循环从链表的头开始处理。
设一个指针值new_list,开始设为NULL,假设它代表的是反转好的链表头结点
再设一个指针值为old_list,用来记录待反转的链表结点,从旧链表的头开始
一个临时变量Temp,Temp为old_list的后一个结点
将old_list的每个结点值赋值给new_list作为新链表的尾,循环结束的条件就是旧链表没有结点了,即old_list==NULL
1 List ReverseList(List l){ 2 List old_list,new_list,Temp; 3 4 old_list=l; /*初始化旧表头为l */ 5 new_list=NULL; /*初始化反转好的链表头为空 */ 6 while(old_list){ //当旧表不为空时 7 Temp=old_list->Next; 8 old_list->Next=new_list; /*连接旧表中的前后两个结点 */ 9 new_list=old_list; /*更新新表头的地址*/ 10 old_list=Temp; /*将旧表头往后移*/ 11 } 12 }
总结:
代码是参考陈越姥姥数据结构的教材的,很奇怪自己自己能理解、也能自己代码实现,但是让我说出来怎么做,不大行。
可能还是理解的不够深刻吧,听说反转单链表是面试必考的,那么自己就得多打几遍了,争取也把递归实现搞清楚。
递归版------------实现
1 List ReverseList2(List l){ 2 3 List old_list,new_list,Temp; 4 old_list=l; 5 if(old_list==NULL || old_list->Next==NULL){ //递归结束条件 6 return old_list; 7 } 8 9 10 new_list=ReverseList(old_list->Next); //找到原链表的最后一个结点作为新链表的第一个结点 11 Temp=old_list->Next; 12 Temp->Next=old_list; //改变结点的指向 13 old_list->Next=NULL; 14 return new_list; 15 }
总结:
递归版和迭代版的不同之处在于,递归版是找到原链表的最后一个结点,然后把它变为新链表的第一个节点的。 而迭代版是从原链表的第一个节点开始,把它变为新链表的最后一个结点(尾插法)
两种思路,从最前面和从最后面开始。
那么上图,
从图中就可以看的很清楚了
迭代是从第一个结点开始反转的,而递归是从最后一个结点开始反转的
自己理解的还不是那么透彻,多刷几次、多多画图。
原文:https://www.cnblogs.com/hpthinking/p/12198520.html