劍指offer第二十五題

2021-09-26 07:49:51 字數 1133 閱讀 6161

題目描述

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

思路:

(1)在原來的鍊錶每個節點後面新增乙個節點,該節點下面連線著原來節點的下乙個節點,並且該節點的值與前面連著的這個節點值相同,比如a->b->c,變成a->a』->b->b』->c->c』。a,a』; b,b』; c,c』 的value分別相同

(2)新新增的節點的random分別指向對應的原節點random的下乙個節點,什麼意思呢,比如說:a->random=c,那麼現在a』->random=c』,至此就完成了原來鍊錶的複製,接下來是輸出複製出來的鍊錶

(3)將已經做好鍊錶拆分,拆為a->b->c,a』->b』->c』。怎麼拆呢,就是將每個節點的next指向其相隔的另乙個節點,要注意的是,在斷開相鄰的兩個節點的連線的時候,要先把後乙個節點的位置先複製出來,要不待會兒前乙個節點指向另外的節點了,後乙個節點的位置就丟了。什麼意思呢,比如說要斷開a->a』的連線,讓a->b,那麼就要先把a』的指標先存起來(放到乙個臨時指標裡),然後再讓a->next指向b,然後再回過頭來對a』進行操作,讓它重新連線到b』。

具體實現結合下面**來看:

class solution 

//將random指向的節點複製到新加入的節點上

headnode=phead;

while(headnode)

//下面這句**要寫在if外面,因為headnode->random很可能指向的是null,如果指向了null,那麼就要繼續遍歷接下來的節點。

headnode=headnode->next->next;

}//將現在的鍊錶每隔相連

//這個鍊錶拆除的步驟可以結合我上面將的第三步來看,說一句,這裡的clonenode用來儲存複製的鍊錶的頭結點指標

randomlistnode* clonenode=phead->next;

headnode=phead;

while(headnode->next)

return clonenode;

}};

牛客網劍指offer第二十五題解答及知識點

問題 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標random指向乙個隨機節點 請對此鍊錶進行深拷貝,並返回拷貝後的頭結點。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解答1 了解什麼是複雜鍊錶。public class solut...

《劍指offer》第二十五題(合併兩個排序的鍊錶)

面試題25 合併兩個排序的鍊錶 題目 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按 照遞增排序的。例如輸入圖3.11中的鍊錶1和鍊錶2,則合併之後的公升序鍊錶如鏈 表3所示。include include list.h listnode merge listnode phead1...

第二十五天

程序 資源分配的最小單元 程序的組成 程式 資料和程序控制塊 pcb 所有的排程都是提前準備的 程序的經典三態 執行 就緒 等待 父程序的id ppid 啟動程序的使用者id uid 排程演算法 1.先來先服務 2.短程序優先 3.高優先順序優先 4.時間片輪轉法 一般都是用這個 先來先服務演算法的...