輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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指標的節點,之後...