题目要求:
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);
}
};
本文介绍了一种解决复杂链表深拷贝问题的方法,该链表中的节点除了包含常规的next指针外,还包含了一个指向链表中任意节点的random指针。文章详细阐述了两步解决方案:首先在原链表每个节点后插入复制节点,并设置random指针;然后将链表拆分为两个独立的链表。
441

被折叠的 条评论
为什么被折叠?



