劍指Offer:面試題26——複製複雜的連結串列(java實現)
阿新 • • 發佈:2019-02-12
問題描述:
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點)。
思路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;
}
}