複雜連結串列拷貝(面試題)
阿新 • • 發佈:2018-12-25
這是《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(); } }