LeetCode OJ - Copy List with Random Pointer

来源:互联网 发布:社交网络百度云下载 编辑:程序博客网 时间:2024/05/11 17:36

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指针,同时记录下旧链表和新链表的节点关系(用map记录);

          遍历新链表,new->random = map[old->random]

/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { *     int label; *     RandomListNode *next, *random; *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */class Solution {public:    RandomListNode *ret;    RandomListNode *copyRandomList(RandomListNode *head) {        if(!head) return NULL;                RandomListNode *last = NULL;        RandomListNode *cur;        map<RandomListNode *, RandomListNode *>mapRandom;                       //复制链表结构        cur = head;        while(cur) {            RandomListNode *node = new RandomListNode(cur->label);            mapRandom.insert(pair<RandomListNode *, RandomListNode *>(cur, node));                         node->random = cur->random;            if(last) last->next = node;                        last = node;            cur = cur->next;        }        mapRandom.insert(pair<RandomListNode *, RandomListNode *>(NULL, NULL));         //复制random指针        cur = mapRandom[head];        while(cur) {            cur->random = mapRandom[cur->random];            cur = cur->next;        }        return mapRandom[head];         }};

如果没有map,在遍历中记录头节点方法:可以采用last指针,当last为空时记录头节点,否则连接链表节点。

            if(last)                 last->next = node;            else                ret = node;

写代码时犯了一个低级错误“RandomListNode *last;”,自动变量初始化值是随机的,需要显示赋值。《深入理解计算机系统》准备再看一遍。

0 0
原创粉丝点击