单链表反转

单链表的翻转是一道很基本的算法题。

        方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。

        方法2:使用三个指针遍历单链表,逐个链接点进行反转。

        方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

        方法1的问题是浪费空间。方法2和方法3效率相当。一般方法2较为常用。

方法2代码:

[cpp]  view plain copy
  1. Node * ReverseList(Node *head)  
  2. {  
  3.     Node *p1,*p2,*p3;  
  4.     if(head==NULL||*head==NULL)  
  5.     return head;  
  6.     p1=head;  
  7.     p2=p1->next;  
  8.     while(p2)             //注意条件  
  9.     {  
  10.         p3=p2->next;       //要改变p2->next的指针,所以必须先保留p2->next           
  11.         p2->next=p1;  
  12.         p1=p2;            //循环往后  
  13.         p2=p3;  
  14.     }  
  15.     head->next=NULL;   //原先的head已经变成tail,别忘了置空,只有到这步才能置空  
  16.     *head=p1;  
  17.     return head;  
  18. }  


方法3代码:

[cpp]  view plain copy
  1. Node* ReverseList(Node* head)   
  2. {   
  3.     Node *p,*q;    
  4.     p=head->next;   
  5.     while(p->next!=NULL)      //在这个循环过程中p所指的元素一直是不变的  
  6.     {  
  7.         q=p->next;   
  8.         p->next=q->next;   
  9.         q->next=head->next;   
  10.         head->next=q;   
  11.     }   
  12.     p->next=head;            //相当于成环   
  13.     head=p->next->next;       //新head变为原head的next   
  14.     p->next->next=NULL;     //断掉环   
  15.     return head;     
  16. }  

你可能感兴趣的:(单链表反转)