1. 程式人生 > >java經典面試題:單鏈表反轉問題詳解(含遞迴法)

java經典面試題:單鏈表反轉問題詳解(含遞迴法)

java經典面試題:單鏈表反轉問題,有兩種方法,一種為迴圈遍歷法,一種遞迴法。
1、迴圈遍歷法
在這裡插入圖片描述
  首先設定三個節點,把當前節點的下一節點指向它前面的節點,此時你會發現指標鏈會斷,所以要先把它後面一個節點用nextNode儲存下來,之後把節點向後移動遍歷即可。
  
程式碼如下:

//定義單鏈表節點類
public class ListNode {
		int value;
		ListNode next;
		
		public ListNode() {
			this.value=0;
			this.next=null;
		}
		public ListNode(int value) {
			this.value=value;
		}
}
	
//定義連結串列反轉方法
public ListNode reverseList(ListNode root) {
		if(root==null)return root;
		ListNode newhead=null;  //反轉後的新連結串列頭結點
		ListNode preNode = null; //前一節點
		ListNode nextNode=null; //下一節點
		ListNode curNode=root; //當前節點
		while(curNode.next!=null) {
			nextNode=curNode.next; //儲存當前節點的下一節點
		    curNode.next=preNode; //使當前節點指向前一節點
		    preNode=curNode;  //把前一節點往後移
		    curNode=nextNode; //把當前節點往後移
		}
		newhead=curNode; 
		return newhead;
	}

2、遞迴法
如果當前節點或者當前節點的下一節點為空,直接返回該節點;
否則使該節點的後一節點指向該節點,以此遞迴。

public BinaryNode reverseList2(BinaryNode root) {
		if(root==null||root.next==null)return root;
		BinaryNode nextNode=root.next; //得到當前節點的下一節點
		root.next=null; //打斷當前指標鏈
		BinaryNode re=reverseList2(nextNode); //每次遞迴下一節點進行反轉
		nextNode.next=root; //反轉指標域
		return re;
	}