1. 程式人生 > >leetcode之反轉鏈表圖文詳解

leetcode之反轉鏈表圖文詳解

inf 示例 efi 依次 def code img 註意 p值

206-反轉鏈表

題目:

反轉一個單鏈表。

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

思路:

叠代法:

新建一個鏈表的頭部,循環遍歷舊鏈表的結點,將其加到新鏈表的後面

遞歸法

代碼:(叠代法)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode new=null;//新建一個結點,依此來作為新表的尾結點
        ListNode p = head;//新建一個結點p,指向head的第一個結點
        while(!head){
            ListNode tmp = p.next;//tmp用來暫時存放p.next
            p.next=new;/*將p(舊鏈表的的第一個結點)指向新結點,即p成為了新鏈表的第一個結點;同時註意這裏將p.next的值改變,所以需要上一步暫時存放剩下舊鏈表的第一個結點*/
            new=p;/*將新鏈表的頭指針始終指向新鏈表的第一個結點*/
            p=tmp;/*將剩下的舊鏈表的第一個結點賦值給p*/
        }
        return new;
    }
}

(遞歸法):

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
      if(head==null || head.next==null){/*遞歸的終止條件,返回的尾結點*/
          return head;
      }
      else{
          ListNode p = head.next;//a
          ListNode rehead = reverseList(p);//b
          p.next = head;//c
          head.next=null;//d
          return rehead;              
        }
    }
}

遞歸法詳解:(參考上代碼)

次數 head p
0 1 2
1 2 3
2 3 4
3 4 5
4 5 null

上圖表示的是遞歸次數對應的head,p值

  • 首先進if判斷,不符合然後進else,執行到a處時,即表上次數為0時圖示為:

技術分享圖片

  • 然後遞歸,在最後一層遞歸的時候,進終止遞歸判斷的時候,即次數為4圖示為:

技術分享圖片

然後返回head

  • 返回後次數為3,p為返回的head=5 此時的圖示為:

技術分享圖片

詳解次數為3的情況:

  • 執行b完時圖示為:

技術分享圖片

  • 繼續執行,執行完c時的圖示為:

    技術分享圖片

    • 繼續執行,執行完d時的圖示為:

      技術分享圖片

      然後返回rehead

返回後的次數為2,即head為3,p為4,執行完b後的圖示:

技術分享圖片

依次執行c、d等操作,等次數為0執行完d時就完成了鏈表的反轉了:

技術分享圖片

這麽看來rehead即為反轉後的鏈表的第一個結點,至此反轉結束。

leetcode之反轉鏈表圖文詳解