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即為反轉后的鏈表的第一個結點,至此反轉結束。