前兩天看到一個面試題:單向鏈表翻轉,自己是個算法菜雞,所以記錄一下筆記和思路
定義單向鏈表數據結構:
/**
* 定義一個單鏈表
*/
public class Node {
private int data; //當前節點數據
private Node next; //下一個節點
public Node (int data) {
this.data = data;
}
public int getData () {
return data;
}
public void setData (int data) {
this.data = data;
}
public Node getNext () {
return next;
}
public void setNext (Node next) {
this.next = next;
}
}
這裏使用一個臨時節點來進行翻轉
public static Node Reverse2 (Node head){
//head爲當前節點
Node preNode = null; //preNode爲前一個節點
Node tempNode = null; //臨時節點
//1、當前節點不爲空則進行翻轉
while(head!=null){
//2、把當前節點head的下一節點數據保存到臨時節點中tempNode中,防止丟失
tempNode = head.getNext();
//3、把當前節點head的下一節點設置爲前一個節點
head.setNext(preNode);
//4、把當前節點head賦值給前一節點
preNode = head;
//5、把臨時節點的數據放到當前節點中
head = tempNode;
}
}
原理就是使用使用一個臨時節點保存下一節點的數據,待當前節點指向前一節點之後再把臨時節點的數據賦值給當前節點
分析一下這注釋中5個步驟的數據變化: 單向鏈表 1—>2—>3—>4—>5
第一次循環:
註釋1,會判斷head是否爲空,如果不爲空進入循環,顯然head爲1—>2—>3—>4—>5
註釋2,會把head.getNext()存入臨時節點tempNode中(臨時變量).這時候tempNode = head.getNext() = 2—>3—>4—>5
註釋3,會把當前節點的next指向前一個節點 head.setNext(preNode).這時候preNode爲初始值null。所以當前head爲1—>null
註釋4,會把當前節點賦值給前一節點preNode=head,這時候preNode的值爲:1—>null
註釋5,會把臨時節點數據賦值給當前節點,這是head = tempNode = 2—>3—>4—>5. 第一次循環結束
第二次循環:
註釋1,判斷head是否爲空,經過第一次循環結束之後head數據變爲 2—>3—>4—>5。不爲空,繼續進入循環
註釋2,把head.getNext()存入臨時及誒單tempNode中,這時候tempNode = head.getNdext() = 3—>4—>5
註釋3,把當前節點的next指向前一個節點,第一次循環之後preNode值爲1—>null,所以head爲2—>1—>null
註釋4,把當前節點賦值給前一節點,這時候preNode的值爲:2—>1—>null
註釋5,把臨時變量的值賦值給當前節點,這時候head的值就會變爲3—>4—>5。第二次循環結束
第三次循。。。第四次循環。。直到循環結束之後preNode就會變爲5—>4—>3—>3—>1