1. 程式人生 > >(劍指offer)複雜連結串列的複製

(劍指offer)複雜連結串列的複製

時間限制: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可能是兩個節點互相指向對方,造成死遞迴迴圈