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...