題目:
有乙個複雜鍊錶,其結點除了有乙個m_pnext指標指向下乙個結點外,還有乙個m_psibling指向鍊錶中的任一結點或者null。其結點的c++定義如下:
請完成函式complexnode* clone(complexnode* phead),以複製乙個複雜鍊錶。
第一種方法:
分成兩步:第一步是複製原始鍊錶上的每個鍊錶,並用m_pnext鏈結起來。第二步,假設原始鍊錶中的某節點n的m_psibling指向結點s。由於s的位置在鍊錶上有可能在n的前面也可能在n的後面,所以要定位n的位置我們需要從原始鍊錶的頭結點開始找。假設從原始鍊錶的頭結點開始經過s步找到結點s。那麼在複製鍊錶上結點n的m_psibling的s』,離複製鍊錶的頭結點的距離也是s。用這種辦法我們就能為複製鍊錶上的每個結點設定m_psibling了。
對乙個含有n個結點的鍊錶,由於定位每個結點的m_psibling,都需要從煉表頭結點開始經過o(n)步才能找到,因此這種方法的總時間複雜度是o(n2)。
#include
using namespace std;
struct complexlistnode ;
/** * 使用一般方式進行複製,時間複雜度o(n*n)
*/complexlistnode* clone(complexlistnode *phead)
p = phead;
complexlistnode *newp = pnewhead;
//第二步:設定每個結點的m_psibling指標
//如果原始鍊錶的頭結點開始沿著m_pnext經過s步找到結點s,那麼複製鍊錶上結點n的n'的m_psibling(s')
//離複製鍊錶的頭結點的距離也是沿著m_pnext指標s步。
while(p)
newp->m_psibling = newsibling;
}p = p->m_pnext;
newp = newp->m_pnext;
}return pnewhead;
}complexlistnode* createnode(int nvalue)
void buildnodes(complexlistnode* pnode, complexlistnode* pnext, complexlistnode* psibling)
}void printlist(complexlistnode* phead)
}// ********************測試**********************
void test(char* testname, complexlistnode* phead)
// -----------------
// \|/ |
// 1-------2-------3-------4-------5
// | | /|\ /|\
// --------+-------- |
// -------------------------
void test1()
// m_psibling指向結點自身
// -----------------
// \|/ |
// 1-------2-------3-------4-------5
// | | /|\ /|\
// | | -- |
// |------------------------|
void test2()
// m_psibling形成環
// -----------------
// \|/ |
// 1-------2-------3-------4-------5
// | /|\
// | |
// |---------------|
void test3()
// 只有乙個結點
void test4()
// 魯棒性測試
void test5()
int main()
劍指Offer26複雜鍊錶的複製
題目 請實現函式複製乙個複雜鍊錶,在複雜鍊錶中,每個結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者null。分析 這個題還是挺有難度的,我剛拿到題的時候想的是我可以先把簡單鍊錶複製一遍,然後再從頭挨著找m psibling指標指向的結點,這樣一...
劍指offer 26 複雜鍊錶的複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 用乙個輔助字典,儲存原鍊錶和複製鍊錶的對應關係。第二次遍歷的時候,生成random節點。c...
劍指Offer程式設計練習025 複雜鍊錶的複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 struct randomlistnode 思路一 遞迴,但是不通過 class...