面試題26 複雜鍊錶的複製

2021-07-15 03:49:07 字數 1970 閱讀 2383

1.給定乙個複雜的鍊錶的資料結構,複製這個鍊錶,在這個資料結構中,每個節點有兩個指標,乙個指標指向下乙個結點,另乙個指標指向鍊錶中的任意結點。

資料結構:

struct complexlistnode

;

分析:

如下圖所示是乙個複雜鍊錶的示意圖,實現標誌指向下一節點的指標,虛線表示指向任意結點的m_psibling指標。如果

m_psibling為空的話,則並沒有指出。

第一步:根據原始鍊錶的每個結點在對應的位置後面複製乙個節點n『 ,如下:

第二步:將複製的節點部分的隨機指標按照原始鍊錶的對應關係連線起來

第三步:將整個長的鍊錶拆分成兩個鍊錶,奇數字置的節點為複製的結點,偶數字置的接點是原始的結點。整個時間複雜度是o(n)。

原始碼:

#includeusing namespace std;

//複雜鍊錶結構

struct complexlistnode

;//建立結點

complexlistnode* createnode(int nvalue);

//鏈結結點

void buildnodes(complexlistnode* pnode, complexlistnode* pnext, complexlistnode* psibling);

//列印鍊錶

void printlist(complexlistnode* phead);

//複製結點並插入

void clonenodes(complexlistnode* phead);

//鏈結複製結點的隨機指標

void connectsiblingnodes(complexlistnode* phead);

//斷開重連線

complexlistnode* reconnectnodes(complexlistnode* phead);

complexlistnode* clone(complexlistnode* phead);

int main()

//建立結點

complexlistnode* createnode(int nvalue)

//連線結點

void buildnodes(complexlistnode* pnode, complexlistnode* pnext, complexlistnode* psibling)

}//列印

void printlist(complexlistnode* phead)

}//複製鍊錶

complexlistnode* clone(complexlistnode* phead)

//複製原結點並插入

void clonenodes(complexlistnode* phead)

}//連線複製結點的隨機指標

void connectsiblingnodes(complexlistnode* phead)

pnode = pcloned->m_pnext; }}

//重新斷開連線

complexlistnode* reconnectnodes(complexlistnode* phead)

while(pnode != null)

return pclonedhead;

}

結果:

面試題26 複雜鍊錶的複製

以下圖為5個結點的複雜鍊錶,實線表示m pnext指標的指向,虛線表示m psibling指標的指向 方法一 分兩步 1 遍歷一遍鍊錶,用m pnext指標將鍊錶連起來,o n 2 確定每個m psibling指標的指向,需重新遍歷新鍊錶確定其m psibling的指向,o n 時間代價為o n 2...

面試題26複雜鍊錶的複製

題目 請複製乙個複雜鍊錶。每個結點除了有乙個next指標指向下乙個結點外,還有乙個sibling指向鍊錶中的任意乙個結點。author 大閒人柴毛毛 date 2016年3月16日 public class copylink 複製每個結點,並插入原結點之後 nodep first while p n...

面試題 複雜鍊錶複製

lettcode面試題35.複雜鍊錶的複製 請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。class node int val node next node...