劍指offer-15(補充)
阿新 • • 發佈:2018-11-06
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null)
return null;
//head為當前節點,如果當前節點為空的話,那就什麼也不做,直接返回null;
ListNode pre = null ;
ListNode next = null;
//當前節點是head,pre為當前節點的前一節點,next為當前節點的下一節點
//需要pre和next的目的是讓當前節點從pre->head->next1->next2變成pre<-head next1->next2
//即pre讓節點可以反轉所指方向,但反轉之後如果不用next節點儲存next1節點的話,此單鏈表就此斷開了
//所以需要用到pre和next兩個節點
//1->2->3->4->5
//1<-2<-3 4->5
while(head!=null){
//做迴圈,如果當前節點不為空的話,始終執行此迴圈,此迴圈的目的就是讓當前節點從指向next到指向pre
//如此就可以做到反轉連結串列的效果
//先用next儲存head的下一個節點的資訊,保證單鏈表不會因為失去head節點的原next節點而就此斷裂
next = head.next;
//儲存完next,就可以讓head從指向next變成指向pre了,程式碼如下
head.next = pre;
//head指向pre後,就繼續依次反轉下一個節點
//讓pre,head,next依次向後移動一個節點,繼續下一次的指標反轉
pre = head;
head = next;
}
//如果head為null的時候,pre就為最後一個節點了,但是連結串列已經反轉完畢,pre就是反轉後連結串列的第一個節點
//直接輸出pre就是我們想要得到的反轉後的連結串列
return pre;
}
}