反轉單鏈表原地法與頭插法
單鏈表遍歷打印
我們先複習一下單鏈表遍歷打印
public void printLink(){
Node curNode = head;
while(curNode !=null){
System.out.print(curNode.data+" ");
curNode = curNode.next;
}
System.out.println();
}
單鏈表打印是用一個curNode
的單指針
來判斷單鏈表是不是空,不是空,直接打印,後移,再判斷是不是空。
直到是空爲止,結束打印。
雙指針反轉單鏈表
這裏的"雙指針反轉單鏈表"是兩個指針prev和curr。prev
指向前一個結點
,curr
指向當前節點
。
public ListNode reverseList(ListNode head) {
//當前節點的前一個節點
ListNode prev = null;
//定義一個輔助指針幫我們遍歷原來的鏈表
ListNode curr = head;
while(curr!=null){
//備份原來的節點
ListNode nextTemp = curr.next;
curr.next = prev;//指針反轉
prev = curr;//前結點後移
curr = nextTemp;//當前結點後移
}
return prev;
}
關鍵是理解這兩步
curr.next = prev;
prev = curr;
這兩步,curr.next=prev
其實可以對照實例想一下,2指向3的指針,指向了1。
就是說,指針原來從左右,就變爲了右左。
指針反轉就完了?不是的,我們只是把當前鏈表的指針向反轉了,新的鏈表的指針還沒有移動。
所以,我們要prev = curr
,讓prev移動。
其實,這裏的prev是反轉後的鏈表的頭節點。注意了,這裏的頭結節可不是什麼輔助節點,是真真實實有數據的頭節點。
一定要根那種輔助頭區分開來。
理解了這兩步,我們就不斷的判斷curr指針是不是空,不斷的反轉就可以了。最後curr==null
時,
我們就返回prev指針。