我卡住的一个原因是,我曾想便利两次,想在第二遍的同时把两个链表分离开,结果失败了。必须三遍,以为random指针很可能指到前面已经断开的节点,而这个还是不用哈希的方式,因此如果前面的链表断开了,就都乱套了。
/*
// 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* first)
{
if(NULL == first)
return NULL;
Node head = Node(-1);
Node newhead = Node(-1);
head.next = first;
Node* node = head.next;
Node* newnode = NULL;
while(NULL != node)
{
Node* curnode = new Node(node->val);
curnode->next = node->next;
node->next = curnode;
node = node->next->next;
}
node = head.next;
newhead.next = node->next;
newnode = newhead.next;
while(NULL != node)
{
newnode = node->next;
newnode->random = NULL==node->random ? NULL : node->random->next;///<random指针可能是NULL
node = node->next->next;;
}
node = head.next;
newhead.next = node->next;
newnode = newhead.next;
while(NULL != node)
{
newnode = node->next;
node->next = newnode->next;
newnode->next = NULL==newnode->next ? NULL : newnode->next->next;
node = node->next;
}
return newhead.next;
}
};