小編在求職找找工作期間劍指offer上的算法題刷了很多遍,並且每道題小編當時都總結了一種最適合面試時手撕算法的最優解法。考慮到劍指offer算法題在面試中的高頻出現,小編每天和大家分享一道劍指offer上的算法題,以及小編總結的答案。下面是第025道劍指offer算法題:
題目描述
輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針random指向一個隨機節點),請對此鏈表進行深拷貝,並返回拷貝後的頭結點。(注意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)
分析
這道題比較有意思,第一次看到這道題時沒有思路,看完答案後,豁然開朗.。建議先自己想想思路,再看答案
思路比較明確,分3步:
- 先賦值next指針:當前節點複製後插入到當前節點的後面,這樣下來,列表長度會先double
- 賦值random指針:cur_node.next.random = cur_node.random.next;
- 鏈表的拆解
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null) return null;
RandomListNode head = pHead;
//非隨機節點的複製
while(head!=null){
RandomListNode tmp = new RandomListNode(head.label);
tmp.next = head.next;
head.next = tmp;
head = tmp.next;
}
//隨機節點的複製
head = pHead;
while(head!=null){
if(head.random!=null){
head.next.random = head.random.next;
}
head = head.next.next;
}
//鏈表的拆分
head = pHead;
RandomListNode aux = head.next;//返回時使用
RandomListNode cur = aux;
while(head!=null){
head.next = cur.next;
head = cur.next;
if(head!=null){
cur.next = head.next;
cur = head.next;
}else{
cur.next = null;
}
}
return aux;
}
}
注:在牛客網上刷劍指offer題目時,最好使用牛客網自帶的編輯器,不建議使用IDE的代碼補全功能,因爲實際面試中是在A4紙上手寫代碼,是沒有代碼提示的。
有些題你看懂了,不代表你會了。看答案前或者看完答案第二天,動手在A4紙上寫寫代碼就知道自己是不是真的會了。
每天分享一道劍指offer算法題目,並且有最適合面試手撕算法環節的解法分享,歡迎大家關注我們~
其他文章
1. 學習筆記和學習資料彙總:前端 + 後端 + java + 大數據 + python + 100多實戰項目 + C++
3. 零基礎學爬蟲
4. 零基礎C++學習總結
歡迎關注個人公衆號【菜鳥名企夢】,公衆號專注:互聯網求職面經、java、python、爬蟲、大數據等技術分享:
公衆號菜鳥名企夢後臺發送“csdn”即可免費領取【csdn】和【百度文庫】下載服務;
公衆號菜鳥名企夢後臺發送“資料”:即可領取5T精品學習資料、java面試考點和java面經總結,以及幾十個java、大數據項目,資料很全,你想找的幾乎都有