1. 程式人生 > >複雜連結串列拷貝(面試題)

複雜連結串列拷貝(面試題)

這是《Google等公司資料結構+演算法面試》上的一道題,原題如下:

下圖是一個含有5個結點的該型別複雜連結串列。



圖中實線箭頭表示m_pNext指標,虛線箭頭表示m_pSibling指標。為簡單起見,

指向NULL的指標沒有畫出。                                

請完成函式ComplexNode*Clone(ComplexNode* pHead),以複製一個複雜連結串列。

分析:在常見的資料結構上稍加變化,這是一種很新穎的面試題。

要在不到一個小時的時間裡解決這種型別的題目,我們需要較快的反應能力,

對資料結構透徹的理解以及紮實的程式設計功底。

在看到這題時,我首先想到的是先複製m_pNext指標時間為O(n),然後對每個m_pSibling進行遍歷搜尋並複製時間複雜度為O(n^2)。在參考了網上提供的思路之後,自己寫了段程式碼實現了一下。

原始碼:

public class ComplexList {
	static class ComplexNode {
		public ComplexNode(int value) {
			this.value = value;
		}

		int value;
		ComplexNode next;
		ComplexNode sibling;
	}

	public static ComplexNode clone(ComplexNode head) {
		if (head == null) {
			return null;
		}
		ComplexNode p = head;
		//在每個原節點後複製一個新節點
		while (p != null) {
			ComplexNode temp = new ComplexNode(p.value);
			temp.next = p.next;
			p.next = temp;
			p = temp.next;
		}
		ComplexNode q;
		p = head;
		//更新新節點的sibling值
		while (p != null) {
			q = p.next;
			if (p.sibling != null)
				q.sibling = p.sibling.next;
			p = p.next.next;
		}
		p = head;
		ComplexNode newHeadNode = head.next;
		//將連結串列拆分為原連結串列和新連結串列
		while (p != null) {
			q = p.next;
			p.next = q.next;
			if (q.next != null)
				q.next = q.next.next;
			p = p.next;
		}
		return newHeadNode;
	}

	public static void main(String[] args) {
		ComplexNode n1 = new ComplexNode(2);
		ComplexNode n2 = new ComplexNode(3);
		ComplexNode n3 = new ComplexNode(4);
		ComplexNode n4 = new ComplexNode(5);
		n1.next = n2;
		n2.next = n3;
		n3.next = n4;
		n1.sibling = n2;
		n2.sibling = n4;
		n3.sibling = n2;
		n4.sibling = n1;
		ComplexNode newNode = clone(n1);
		ComplexNode p = newNode;
		while (p != null) {
			System.out.print(p.value+" ");
			p = p.next;
		}
		System.out.println();
	}
}