LeetCode138:Copy List with Random Pointer

mickole發表於2014-02-18

題目:

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

解題思路:

拷貝連結串列時,新節點的random指標不太好設定,因為是隨機的,所以如果採用常規方法,必須每設定一個新節點的random指標時,必須到兩連結串列中進行查詢。

這裡,我採用了一些小技巧,當拷貝一個新節點時,將該新節點連線到原節點的後面

第一步做完後,遍歷連結串列,設定拷貝節點的random指標,設定拷貝節點的random指標時,可根據原節點的random指標進行設定,因為原節點的random指向的節點的下一個節點即為拷貝節點額random要指向的節點。

最後,將連結串列進行分離即可。

實現程式碼:

#include <iostream>
using namespace std;

struct RandomListNode 
{
     int label;
     RandomListNode *next, *random;
     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
};

class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        if(head == NULL)
            return NULL;
        RandomListNode *p = head;
        while(p)
        {
            RandomListNode *node = new RandomListNode(p->label);//拷貝一個新節點,然後將該新節點連結到原節點的後面 
            node->next = p->next;
            p->next = node;
            p = node->next;
        }
        
        p = head;
        while(p)//根據原節點設定新節點的random指標 
        {
            if(p->random)//如果原節點的random指標不為空則設定拷貝節點 
            {
                //拷貝節點的random指標指向的節點可利用原節點的random指標找到,
                //因為每個拷貝節點都在原節點的下一個節點
                p->next->random = p->random->next;    
            }
            
            p = p->next->next;
        }
        
        //將原連結串列和新建連結串列進行分離 
        RandomListNode *chead = head->next;
        head->next = head->next->next;
        RandomListNode *q = chead;       
        head = head->next;
        while(head)
        {
            q->next = head->next;
            head->next = head->next->next;
            head = head->next;
            q = q->next;
            
        }
        return chead;
    
    }
};
int main(void)
{
    return 0;
}

相關文章