題目:
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; }