leetcode之反轉鏈表圖文詳解
阿新 • • 發佈:2018-07-28
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之反轉鏈表圖文詳解