分享

链表的逆序

 雪柳花明 2016-09-24
有两种方法,时间复杂度都是O(n)

第一种:非递归的算法。
设置两个临时指针prev和next分别标记当前结点的前驱和后继,将当前结点的next指针指向前驱,然后把前驱指针替换为当前结点,当前结点替换为next,即向“后”移动,直到链表空了(next为NULL)

  1. /** 
  2.  * Definition for singly-linked list. 
  3.  * public class ListNode { 
  4.  *     int val; 
  5.  *     ListNode next; 
  6.  *     ListNode(int x) { val = x; } 
  7.  * } 
  8.  */  
  9.    
  10.  // 1 <-2 3  
  11. public class Solution {  
  12.     public ListNode reverseList(ListNode head) {  
  13.         if(head==null || head.next==nullreturn head;  
  14.           
  15.         ListNode pre = head;  
  16.         ListNode p = head.next;  
  17.         pre.next = null;  
  18.         ListNode nxt;  
  19.         while(p!=null) {  
  20.             nxt = p.next;  
  21.             p.next = pre;  
  22.             pre = p;  
  23.             p = nxt;  
  24.         }  
  25.         return pre;  
  26.     }  
  27. }  



第二种:递归的算法。
递归算法描述:要将当前结点逆序,那么先将它的后继结点都逆序,然后把逆序后的尾结点的next指向当前结点即可。

1 recursion

[java] view plain copy
  1. /** 
  2.  * Definition for singly-linked list. 
  3.  * public class ListNode { 
  4.  *     int val; 
  5.  *     ListNode next; 
  6.  *     ListNode(int x) { val = x; } 
  7.  * } 
  8.  */  
  9. public class Solution {  
  10.     public ListNode reverseList(ListNode head) {  
  11. //如果头节点为空,或者头结点的下一个节点为空,直接返回头节点
  12.         if(head==nullreturn null;  
  13.         if(head.next==nullreturn head;  
  14.           
  15.         ListNode p = head.next;//从链表的第二个节点开始子链表递归  
  16.         ListNode n = reverseList(p);  //返回新的头结点,返回的是reverse好的新头节点
  17.           
  18. //重建老的头结点head和第二个节点p之间的关系。
  19.         head.next = null;  //老的头结点为空
  20.         p.next = head;  //第二个节点p指向老的头结点
  21.         return n;  
  22.     }  
  23. }  




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多