【連結串列問題】打卡8:複製含有隨機指標節點的連結串列

苦逼的碼農發表於2018-12-11

前言

以專題的形式更新刷題貼,歡迎跟我一起學習刷題,相信我,你的堅持,絕對會有意想不到的收穫。每道題會提供簡單的解答,如果你有更優雅的做法,歡迎提供指點,謝謝。

注:如果程式碼排版出現了問題麻煩通知我下,謝謝。

【題目描述】

【連結串列問題】打卡8:複製含有隨機指標節點的連結串列

【要求】

如果連結串列的長度為 N, 時間複雜度達到 O(N)。

【難度】

尉:★★☆☆

【解答】

方法一:使用額外的儲存空間

這道題的難點在於我們需要定位好隨機指標,一個比較簡單的解法就是把原節點與複製的節點關聯起來,可以使用雜湊表把他們關聯起來。

首先把副節點全部建立出來,然後把原節點與對應的副節點用雜湊表關聯起來。關聯的時候原節點作為key,副節點作為value。例如對於連結串列 1->2->3->null。建立副節點 1', 2', 3'。然後用雜湊表關聯起來:

keyvalue
11'
22'
33'

之後在把所有副節點連線成一個連結串列。在連線的時候,我們 可以透過雜湊表很容易這找到對應的隨機節點。

程式碼如下

 1//方法1:採用雜湊表
2public static Node1 copyListWithRand(Node1 head{
3    Map<Node1, Node1> map = new HashMap<>();
4    Node1 cur = head;
5    while (cur != null) {
6        map.put(cur, new Node1(cur.value));
7        cur = cur.next;
8    }
9    //把副節點連線起來
10    cur = head;
11    while (cur != null) {
12        map.get(cur).next = map.get(cur.next);
13        map.get(cur).rand = map.get(cur.rand);
14        cur = cur.next;
15    }
16    return map.get(head);
17}

這種方法的時間複雜度為 O(n), 空間複雜度也為 O(n)。

方法2

其實我們也可以不需要雜湊表來輔助,也就是說 ,我們是可以做到空間複雜度為 O(1)的,我們可以把複製的副節點插入到原連結串列中去,這樣也能把原節點與副節點進行關聯,進而
定位到隨機節點。例如,對於連結串列 1->2->3->null。首先生成副節點 1', 2', 3。然後把副節點插入到原節點的相鄰位置,即把原連結串列變成 1->1'->2->2'->3->3'->null。

這樣我們也可以在連線副節點的時候,找到相應的隨機節點。例如 1 的隨機節點是 3,則 1' 的隨機節點是 3'。顯然,1節點的隨機節點的下一個節點就是 1'的隨機節點。具體程式碼如下:

 1//方法二
2public static Node1 copyListWithRand2(Node1 head){
3    Node1 cur = head;
4    Node1 next = null;
5
6    //把複製的節點插進去
7    while (cur != null) {
8        next = cur.next;
9        Node1 temp = new Node1(cur.value);//複製節點
10        temp.next = cur.next;
11        cur.next = temp;
12        cur = next;
13    }
14    //在一邊把複製的節點取出來一邊連線。
15    cur = head;
16    next = null;
17    while (cur != null) {
18        next = cur.next.next;//儲存原連結串列的下一個節點
19        cur.next.next = next != null ? next.next : null;
20        cur.next.rand = cur.rand != null ? cur.rand.next : null;
21        cur = next;
22    }
23    return head.next;
24}

採用這種方法的時候,由於隨機節點有可能是空指標,隨意寫程式碼的時候要注意。

問題擴充

思考:如果是有兩個隨機指標呢?又該如何處理呢?三個呢?

【題目描述】

【要求】

【難度】

未知。

【解答】

提醒:別想太多了,保持清醒。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561266/viewspace-2284820/,如需轉載,請註明出處,否則將追究法律責任。

相關文章