劍指Offer 26 複雜鍊錶的複製

2021-07-07 08:34:10 字數 2387 閱讀 2873

題目:

有乙個複雜鍊錶,其結點除了有乙個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...