請實現函式complexlistnode* clone(complexlistnode* phead),複製乙個複雜鍊錶。
在複雜鍊錶中,每個結點除了有乙個pnext指標指向下乙個結點之外,還有乙個psibling指向鍊錶中的任意結點或者null。
結點的定義如下:
struct complexlistnode;
方法1:
複製原始鍊錶上的每乙個結點,並通過pnext連線起來;然後再設定每個結點的psibling指標。
假設原始鍊錶中某個結點n的psibling指標指向結點s,那麼就需要從頭到尾遍歷查詢結點s,如果從原始鍊錶的頭指標開始,經過m步之後達到結點s,那麼在複製鍊錶中的結點n'的psibling指標指向的結點也是距離複製鍊錶s步的結點。通過這種辦法就可以為複製鍊錶上的每個結點設定psibling指標。
時間複雜度:o(n^2)
方法2:
方法1是通過鍊錶查詢來得到psibling指標所指向的結點,實際上我們可以通過空間換取時間,將原始鍊錶和複製鍊錶的結點通過雜湊表對應起來,這樣查詢的時間就從o(n)變為o(1)。具體如下:
複製原始鍊錶上的每個結點n建立n',然後把這些建立出來的結點用pnext連線起來。同時把的配對資訊方法乙個雜湊表中;然後設定複製鍊錶中的每個結點的psibling指標,如果原始鍊錶中結點n的psibling指向結點s,那麼在複製鍊錶中,對應的n'應該指向s'。
時間複雜度:o(n)
方法3:
在不使用輔助空間的情況下實現o(n)的時間效率。
第一步:根據原始鍊錶的每個結點n建立對應的n',然後將n『通過pnext接到n的後面;
第二步:設定複製出來的結點的psibling。假設原始鍊錶上的n的psibling指向結點s,那麼其對應複製出來的n'是n->pnext指向的結點,同樣s'也是結點s->pnext指向的結點。
第三步:把長鍊錶拆分成兩個鍊錶,把奇數字置的結點用pnext連線起來的就是原始鍊錶,把偶數字置的結點通過pnext連線起來的就是複製鍊錶。
1、hash方法:
struct complexlistnode;
};typedef std::mapmap;
complexlistnode* clonenodes(complexlistnode* phead,map &hashnode)
return pnode->pnext;
}void setsiblings(complexlistnode* phead,complexlistnode* pcopy,map &hashnode)
}complexlistnode* complexlistcopy(complexlistnode* phead)
2、複製連線方法:
#include using namespace std;
struct complexlistnode;
};void clonenodes(complexlistnode* phead)
}void connectsiblingnodes(complexlistnode* phead)
pnode=pcloned->pnext;
}}complexlistnode* reconnectnodes(complexlistnode* phead)
while(pnode!=null)
return pclonedhead;
}complexlistnode* clone(complexlistnode* phead)
ac**:
/*
struct randomlistnode
};*/
class solution
return pcopy->next;
}void setrandomnode(randomlistnode* phead,randomlistnode* pcopy,map &hashnode)
}randomlistnode* clone(randomlistnode* phead)
};
/*
struct randomlistnode
};*/
class solution
void clonenodes(randomlistnode* phead)
}void clonerandom(randomlistnode* phead)
phead=pcloned->next;}}
randomlistnode* reconnectnodes(randomlistnode* phead)
while(pnode!=null)
return pclonedhead;
}};
劍指Offer 面試題26 複雜鍊錶的複製
複雜鍊錶的複製 請事先函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標 指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者null。a b c d e 兄弟指向 a指向...
劍指offer 面試題26 複雜鍊錶的複製
以下圖為5個結點的複雜鍊錶,實線表示m pnext指標的指向,虛線表示m psibling指標的指向 解法一 分兩步1 遍歷一遍鍊錶,用m pnext指標將鍊錶連起來,o n 2 假設原始鍊錶中的某節點n的m psibling指向結點s,由於s的位置在鍊錶上有可能在n的前面也可能在n的後面,所以要定...
《劍指Offer》面試題26 複雜鍊錶的複製
劍指offer 面試題26 複雜鍊錶的複製 分解複雜問題 請實現乙個函式用於複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者null。結點的c 定義如下 複雜鍊錶結點定義 struct complexlistn...