java單向鏈表翻轉

前兩天看到一個面試題:單向鏈表翻轉,自己是個算法菜雞,所以記錄一下筆記和思路

定義單向鏈表數據結構:


/**
 * 定義一個單鏈表
 */
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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章