单链表的翻转

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

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

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

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

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

方法2代码:

 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代码:

 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 }  

 

posted @ 2015-07-10 16:54  笨笨小成  阅读(160)  评论(0编辑  收藏  举报