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;”,自动变量初始化值是随机的,需要显示赋值。《深入理解计算机系统》准备再看一遍。