单链表的逆置

来源:互联网 发布:java中锁的种类 编辑:程序博客网 时间:2024/04/29 12:15

最近看了面试常问到的单链表逆置问题,做了一下总结。

第一种方法,使用三指针。

  1. node *reverse(node *head)  
  2. {  
  3.     node *p1,*p2,*p3;  
  4.       
  5.     if(head==NULL||head->next==NULL)  
  6.         return head;  
  7.     p1=head,p2=p1->next;  
  8.     while(p2)  
  9.     {  
  10.         p3=p2->next;  
  11.         p2->next=p1;  
  12.         p1=p2;  
  13.         p2=p3;  
  14.     }  
  15.     head->next=NULL;  
  16.     head=p1;  
  17.     return head;  
  18. }  

最后执行完循环后,记得让head->next = NULL; 让P1做head节点,即可实现逆置。

第二种方法,递归。

  1. LNode* ReverList1(LNode* head)  
  2. {  
  3.     if (head == NULL)  
  4.         return NULL;  
  5.     if (head->next == NULL)  
  6.     {  
  7.         return head;  
  8.     }  
  9.     LNode* Node = head; //保留上一个结点  
  10.     LNode* Nex = head->next;  
  11.     LNode* HeadNode = ReverList1(Nex);  
  12.     Nex->next = Node; //逆置  
  13.     Node->next = NULL; //这句必须有,否则会产生循环链表  
  14.     return HeadNode;//返回逆置链表的尾结点  
  15.       
  16. }  
 

理解图如下


0 0
原创粉丝点击