複雜鍊錶的複製

2021-07-23 23:29:14 字數 1934 閱讀 3349

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

解題思路:

1、複製每個節點,並將該結點的複製結點插入到該結點後面,

如:鍊錶為:a->b->c->d, 經過複製步驟後的鍊錶為:a->a1->b->b1->c->c1->d->d1

2、遍歷鍊錶,a1->random = a->random->next;

3、將鍊錶拆分成原鍊錶和複製後的鍊錶

假設鍊錶為:1-->2-->3 ,1,2,3代表結點的值,結點值為1結點的random指標指向3,  3的random指標指向2

第一步:複製每個節點,並將該結點的複製結點插入到該結點後面

while(pcurrent)

複製後的結點如下圖:phead始終指向原始鍊錶的頭結點

第二步:根據每個結點的random指標情況處理每個複製結點的random指標

前乙個步驟結束後,pcurrent指向結點的尾部,下一步應從頭開始處理

pcurrent = phead;

while(pcurrent)

pcurrent = pcloned->next;

}

第一幅圖為第二步完成後的鍊錶結構圖,複製結點的random指標指向如第二幅圖所示

第三步:將鍊錶的原始結點與複製結點斷開,並使原始結點構成乙個鍊錶,複製結點構成乙個鍊錶

進行下一步pcurrent應從頭開始,此步驟改變的是結點的next指標的指向,並沒有改變random指標

pcurrent = phead;

randomlistnode *pclonedhead = phead->next;

randomlistnode *pcurrentcloned = null;

while(pcurrent->next)

該步驟的第一次處理後鍊錶next指標結構圖為: 

該題完整c++**:

struct randomlistnode 

};class solution

//根據每個結點的random指標情況處理每個複製結點的random指標

//前乙個步驟結束後,pcurrent指向結點的尾部,下一步應從頭開始處理

pcurrent = phead;

while(pcurrent)

pcurrent = pcloned->next;

} //將鍊錶的原始結點與複製結點斷開,並使原始結點構成乙個鍊錶,複製結點構成乙個鍊錶

//此步驟改變的是next指標的指向,並沒有改變random指標的指向

//進行下一步pcurrent應從頭開始

pcurrent = phead;

randomlistnode *pclonedhead = phead->next;

randomlistnode *pcurrentcloned = null;

while(pcurrent->next)

return pclonedhead;}};

鍊錶 複雜鍊錶的複製

問題描述 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。結點的定義如下 struct randomlistnod...

複雜鍊錶複製

複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...

複製複雜鍊錶

題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...