一、題目
請實現函式complexlistnode* clone(complexlistnode* phead),複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m_pnext指標指向下乙個結點外,還有乙個m_psibling 指向鍊錶中的任意結點或者nullptr。
二、關鍵
1.在原始鍊錶上擴充新的鍊錶。
2.m_psibling指標的指向問題。
3.拆分鍊錶。
三、解釋
1.解題思路一:根據原始鍊錶中的節點n建立對應的節點n'。
第一步,複製原始鍊錶的任意節點n並建立新節點n',再把n'連線到n的後面。
第二步,設定複製出來的節點的m_psibling.假設原始鍊錶上的n的m_psibling指向節點s,那麼對應複製出來的n'是n的m_pnext指向節點,同樣s'也是s的m_pnext指向的節點。(如果原始鍊錶上的節點n的m_psibiling指向s,則它對應的複製節點n'的m_psibling指向s的複製節點s『。)
第三步,經過上面兩步之後得到的長鍊錶拆分成兩個鍊錶。把奇數字的節點用m_pnext鏈結起來就是原始鍊錶,把偶數字的節點用m_pnext鏈結起來就是複製出來的鍊錶。
2.解題思路二:分兩步。第一步複製原始鍊錶上的每個節點n建立n',然後把這些建立出來的節點用m_pnext鏈結起來。同時,我們把的配對資訊放到乙個雜湊表中;第二步設定複製鍊錶上每個節點的m_psibling。如果在原始鍊錶中節點n的m_psibling指向節點s,那麼在複製鍊錶中,對應的n'應該指向s'。由於有了雜湊表,我們可以用o(1)的時間根據s找到s'。
四、**
complexlist.h如下:
#pragma once
struct complexlistnode
;complexlistnode* createnode(int nvalue);
void buildnodes(complexlistnode* pnode, complexlistnode* pnext, complexlistnode* psibling);
void printlist(complexlistnode* phead);
complexlist.cpp如下
#include #include "complexlist.h"
complexlistnode* createnode(int nvalue)
void buildnodes(complexlistnode* pnode, complexlistnode* pnext, complexlistnode* psibling)
}void printlist(complexlistnode* phead)
}
copycomplexlist.cpp如下:
#include #include "complexlist.h"
void clonenodes(complexlistnode* phead);
void connectsiblingnodes(complexlistnode* phead);
complexlistnode* reconnectnodes(complexlistnode* phead);
complexlistnode* clone(complexlistnode* phead)
void clonenodes(complexlistnode* phead)
}void connectsiblingnodes(complexlistnode* phead)
pnode = pcloned->m_pnext;
}}complexlistnode* reconnectnodes(complexlistnode* phead)
while(pnode != nullptr)
return pclonedhead;
}// ********************測試**********************
void test(const 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(int argc, char* argv)
面試題35 複雜鍊錶的複製
題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 方法一 三步 struct randomlistnode class solut...
面試題35 複雜鍊錶的複製
請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。示例 1 輸入 head 7,null 13,0 11,4 10,2 1,0 輸出 7,null 13,0 1...
面試題35 複雜鍊錶的複製
題目 請實現函式complexlistnode clone complexlistnode phead 復 制乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling 指向鍊錶中的任意結點或者nullptr。include include inc...