題目要求
輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
自己的想法
對於本題目,我一開始很悶,這不就是吧節點返回而已嗎?但是當我看到了題目的末尾,眉頭一皺,發現此事並不簡單,題目要求返回不要返回引數中的節點引用。
果然還是我太天真了,本來想那就遍歷一下就建立乙個節點,然後連起來不就行了,但是後面發現它這個鍊錶比較**,還有乙個隨意的指標域,指向根本就不能在建立的時候確定,因為可能指向鍊錶之後的節點,此時還沒有建立,想了很久之後還是想不出來,於是就開始網上衝浪了。
思路
在看了其他博文之後,開啟了新世界大門,它的思路是,建立乙個新的節點,將其連線在被複製的節點後面,總的來說就是原始鍊錶每乙個節點都有乙個備份,然後每乙個備份都連線在被備份節點的後面。
接著我們修改新的節點中的random指標域,只要被備份的節點random指標域不為空,那麼我們就將該節點的random指標域賦給備份節點的random指標域。最後就是將兩個鍊錶拆開,形成兩個鍊錶,放回備份鍊錶的頭指標。
步驟
1.複製原始節點的每乙個節點,將複製後的節點連線在其後面,然後指標指向複製節點的下乙個節點,進行下一次複製,直到結束。
2.需要給複製節點的random指標域賦值,我們一開始指標指向頭結點,判斷頭結點的random指標域是否為空,如果為空,我們直接進行head=head->next->next,原因是head節點後面是自己的備份。
當head的random指標域不為空時,我們需要將其指標域中的值賦給複製節點的random指標域,所以需要執行head->next->random=head->random->next;然後我們需要向下移動指標進行下乙個,head=head->next->next,原因是head節點下乙個節點是自己的拷貝。
3.最後就是解開兩個鍊錶,我們將head指向第乙個節點,將copy指向下乙個節點,然後判斷copy的next指標域是否為空(則看一下還有沒有下乙個需要拆分的節點)。
如果不為空就進行迴圈,將copy的next指標域賦給head的next指標域,此時head指向了copy的下乙個節點,也就是原始鍊錶中head的下乙個節點,然後將head->next->next賦值給copy的next指標。
此時copy指向了原始鍊錶中head的下乙個節點的下乙個節點,也就是複製鍊錶的第二個節點,接著將head指標和copy指標往下移動,接著迴圈直到結束。
4.迴圈結束,看似好像已經可以了,但是需要注意題目要求,返回的鍊錶不能包含phead,但是此時原始鍊錶的最後乙個節點的next指標域還保留著複製後鍊錶最後乙個節點的位址,因此整個鍊錶還是有phead指標,所以需要將head的next指標域置空。
**
/*
struct randomlistnode
};*/
class
solution
randomlistnode* head=phead;
while
(head!=
null
) head=phead;
while
(head!=
null
) head=head-
>next-
>next;
} head=phead;
randomlistnode* copy=phead-
>next;
randomlistnode* result=phead-
>next;
while
(copy-
>next!=
null
) head-
>next=
null
;return result;}}
;
複雜鍊錶複製
複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...
複製複雜鍊錶
題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...
複雜鍊錶複製
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 核心思路 複製鍊錶中每乙個節點,插入到被複製節點後面 維護複製節點的隨機指標,該指標指向被...