1. 程式人生 > >使用遞迴和非遞迴方式反轉單向連結串列

使用遞迴和非遞迴方式反轉單向連結串列

問題:

給一個單向連結串列,把它從頭到尾反轉過來。比如: a -> b -> c ->d 反過來就是 d -> c -> b -> a 。

分析:

假設每一個node的結構是:

class Node {
	char value;
	Node next;
}

因為在對連結串列進行反轉的時候,需要更新每一個node的“next”值,但是,在更新 next 的值前,我們需要儲存 next 的值,否則我們無法繼續。所以,我們需要兩個指標分別指向前一個節點和後一個節點,每次做完當前節點“next”值更新後,把兩個節點往下移,直到到達最後節點。

程式碼如下:

public Node reverse(Node current) {
	//initialization
	Node previousNode = null;
	Node nextNode = null;
	
	while (current != null) {
		//save the next node
		nextNode = current.next;
		//update the value of "next"
		current.next = previousNode;
		//shift the pointers
		previousNode = current;
		current = nextNode;			
	}
	return previousNode;
}

上面程式碼使用的是非遞迴方式,這個問題也可以通過遞迴的方式解決。程式碼如下:
public Node reverse(Node current)
 {
     if (current == null || current.next == null) return current;
     Node nextNode = current.next;
     current.next = null;
     Node reverseRest = reverse(nextNode);
     nextNode.next = current;
     return reverseRest;
 }
遞迴的方法其實是非常巧的,它利用遞迴走到連結串列的末端,然後再更新每一個node的next 值 (程式碼倒數第二句)。 在上面的程式碼中, reverseRest 的值沒有改變,為該連結串列的最後一個node,所以,反轉後,我們可以得到新連結串列的head。