1. 程式人生 > >劍指Offer:面試題26——複製複雜的連結串列(java實現)

劍指Offer:面試題26——複製複雜的連結串列(java實現)

問題描述:

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點)。

思路1:

1.先複製連結串列節點,並用next連結起來。
2.然後對每一個結點去修改它的隨機指標S。遍歷連結串列找到S。
時間複雜度O(n^2)

思路2:

1.先複製連結串列節點N-N’,並用next連結起來,並用一個哈系表儲存《N, N‘》結點對,
2.然後對每一個結點去修改它的隨機指標S。此時,我們根據哈系表很容易新增每個複製節點的random指標。
時間複雜度O(n),空間複雜度O(n)

思路3:

在思路2的基礎上,不使用額外的記憶體空間。
1.複製原始連結串列結點N—-》N’,並把N‘插入到N的後面。
2.那麼原來的隨機指標N-》S ,此刻就應該變為:N’-S‘,顯然都是很容易獲得的。
3.把上述連結串列拆分成兩個連結串列,一個是原來的連結串列,一個是新複製的連結串列。

/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead == null){
            return
null; } //複製接結點 CopyList(pHead); //連線隨機指標 ConnectRandom(pHead); //拆分連結串列 return ReconnectNodes(pHead); } public static void CopyList(RandomListNode pHead){ if(pHead == null){ return; } RandomListNode pNode = pHead; while
(pNode != null){ RandomListNode pCloned = new RandomListNode(pNode.label); pCloned.next = pNode.next; pCloned.random = null; pNode.next = pCloned; pNode = pCloned.next; } } public static void ConnectRandom(RandomListNode pHead){ RandomListNode pNode = pHead; while(pNode != null){ RandomListNode pCloned = pNode.next; if(pNode.random != null){ pCloned.random = pNode.random.next; } pNode = pCloned.next; } } public static RandomListNode ReconnectNodes(RandomListNode pHead){ RandomListNode pNode = pHead; RandomListNode pClonedHead = null; RandomListNode pClonedNode = null; if(pNode != null){ pClonedHead = pClonedNode = pNode.next; pNode.next = pClonedNode.next; pNode = pNode.next; } while(pNode != null){ pClonedNode.next = pNode.next; pClonedNode = pClonedNode.next; pNode.next = pClonedNode.next; pNode = pNode.next; } return pClonedHead; } }