1. 程式人生 > 其它 >leetcode演算法題:複雜連結串列的複製

leetcode演算法題:複雜連結串列的複製

題目:
請實現 copyRandomList 函式,複製一個複雜連結串列。在複雜連結串列中,每個節點除了有一個 next 指標指向下一個節點,還有一個 random 指標指向連結串列中的任意節點或者 null。

示例 1:

在這裡插入圖片描述

輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

題解:假設原結點為A-B-C-D-E
複製後的結點為A’-B’-C’-D’-E’
一共分為三個步驟
1、複製每個結點,而且讓每個複製後的結點接在被複制的節點後面:
A-A’-B-B’-C-C’-D-D’-E-E’

2、複製每個A’的random結點資訊,讓它通向相應的D’
3、將複製的連結串列從長連結串列中剝離出來

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        //1.1判斷null表
        if (NULL == head) return head;
        //1.2定義一個複製表頭
        Node* cur = head;

        while (cur != NULL) {
            //1.3拷貝一個copynode的值為A',假設原連結串列的值為A
            Node* copyNode = new Node(cur->val);
            //1.4將這個copynode插入到A後面
            copyNode->next = cur->next;
            cur->next = copyNode;
            //1.5更新這個被拷貝的節點,即為A->A'->B,cur就是被拷貝的結點指標
            cur = cur->next->next;
        }
       //2.1現在得到一個拷貝後的連結串列,下面就是將這個連結串列的random同樣複製一次
        cur = head;//找到頭部
        while(cur != NULL) {
            if (cur->random != NULL) {
                //2.2將cur(A)的random指標(D)的拷貝指標(D')   交給  cur.next(A')指標
                cur->next->random = cur->random->next;
            }
            //2.3更新cur(A)的資料,也就是把它更新成B,也就是後兩位的next
            cur = cur->next->next;
        }
        //3.1現在得到一個連結串列,包含兩份完全相同的資料元素,A-A'-B-B'-C-C'-D-D'-E-E'
        //現在把他們拆開,只留下複製後的那個連結串列 A-B-C-D-E和A'-B'-C'-D'-E'
        cur = head;//3.2先找到頭結點
        Node* copyHead = head->next;
        Node* copyCur = head->next;

        while (cur != NULL) {
            //3.3 cur:切斷A-A'
            cur->next = cur->next->next;
            //3.4 更新cur,變成B----
            cur = cur->next;
            //3.5 copycur:切斷A'-B
            if (copyCur->next != NULL) {
                copyCur->next = copyCur->next->next;
                //3.6 更新curcopy,變成B'------
                copyCur = copyCur->next;
            }
        }

        return copyHead;
    }
};