4---反转单链表

题目:

  将单链表进行反转。比如链表为: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 }

总结:

  递归版和迭代版的不同之处在于,递归版是找到原链表的最后一个结点,然后把它变为新链表的第一个节点的。  而迭代版是从原链表的第一个节点开始,把它变为新链表的最后一个结点(尾插法)

两种思路,从最前面和从最后面开始。

那么上图,

从图中就可以看的很清楚了

  迭代是从第一个结点开始反转的,而递归是从最后一个结点开始反转的 

自己理解的还不是那么透彻,多刷几次、多多画图。

猜你喜欢

转载自www.cnblogs.com/hpthinking/p/12198520.html
今日推荐