(劍指offer)複雜連結串列的複製
阿新 • • 發佈:2018-12-07
時間限制:1秒 空間限制:32768K 熱度指數:258694
本題知識點: 連結串列
題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
思路1
先把連結串列的各個節點都複製一遍,建立源節點和新節點的對映關係,然後把新節點都串起來就好了!!比較有技巧的一點是random必然指向的是連結串列中的某個節點,所以只需要通過map.get獲取相應的新建立的節點即可。
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
import java.util.*;
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
RandomListNode tmp = pHead;
//先把連結串列的每個節點複製一份
while(tmp != null) {
map.put(tmp, new RandomListNode(tmp.label));
tmp = tmp.next;
}
tmp = pHead;
RandomListNode head = map.get(pHead);
//把複製的各個節點串成連結串列
while(tmp != null){
map.get(tmp).next = map.get(tmp.next);
map.get(tmp).random = map. get(tmp.random);//random必定是連結串列中的某個節點
tmp = tmp.next;
}
return head;
}
}
思路2:遞迴(錯誤)
簡單粗暴的遞迴方法是不可行的,因為random可能是兩個節點互相指向對方,造成死遞迴迴圈