题目要求:
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.
剑指offer上出现过这个题目,思路是:
1.首先指向在原链表的每个节点后面,复制一个新的节点,原链表长度变为 2 倍random 指针指向的是 原链表节点 random 指针指向的节点的后面的那个节点。
2.将链表拆成两个链表.
代码:
class Solution {
public:
void CopyNodeAndRandomPointer(RandomListNode* head)
{
RandomListNode* node = head;
while (NULL != node) {
RandomListNode* new_node = new RandomListNode(node->label);
new_node->next = node->next;
node->next = new_node;
node = new_node->next;
}
//set random pointer
node = head;
while (NULL != node) {
RandomListNode* pnext = node->next;
if (NULL != node->random) {
pnext->random = node->random->next;
}
node = pnext->next;
}
}
RandomListNode* SeperateList(RandomListNode* head)
{
RandomListNode* node = head, *clone_head = NULL, *clone_node = NULL;
if (NULL != node) {
clone_head = clone_node = node->next;
node->next = clone_node->next;
node = node->next;
}
while (NULL != node) {
clone_node->next = node->next;
clone_node = clone_node->next;
node->next = clone_node->next;
node = node->next;
}
return clone_head;
}
RandomListNode *copyRandomList(RandomListNode *head) {
CopyNodeAndRandomPointer(head);
return SeperateList(head);
}
};