面試題35 複雜鍊錶的複製

2021-08-29 04:10:51 字數 3018 閱讀 6345

一、題目

請實現函式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...