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.
一个链表复制,除了复制next指针外还的复制random指针。注意是random指针复制。
思路:(图片转自:http://www.2cto.com/kf/201310/253477.html)推荐看此文章分析的相当好:http://www.2cto.com/kf/201310/253477.html
先插入相邻节点,根据链表的特点,很容易获取random指针。
node1->next->random = node1->random->next;
之后再将链表拆分成俩个链表即可!
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *pold_list,*pnew_list,*final_list;
if(head == NULL)return NULL;
pold_list = head;
pnew_list = NULL;
//间隙中插入节点
while(pold_list!= NULL)
{
RandomListNode *temp_node = new RandomListNode(pold_list->label);
if(temp_node == NULL)return NULL;
temp_node->next = pold_list->next;
pold_list->next = temp_node;
pold_list = pold_list->next->next;//或者pold_list = temp_node->next;
}
pold_list = head;
pnew_list = head->next;
//处理random指针
while(pold_list != NULL)
{
if(pold_list->random)
{
pnew_list->random = pold_list->random->next;//random指针处理
}
else
{
pnew_list->random = NULL;
}
pold_list = pnew_list->next;//移动,即 pold_list = pold_list->next->next;
if(pold_list != NULL)
pnew_list = pold_list->next;//移动,即 pnew_list = pnew_list->next->next;
}
//分离出俩链表,老链表与新链表
pold_list = head;
pnew_list = head->next;
final_list = pnew_list;
while(pold_list != NULL)
{
pold_list->next = pnew_list->next;//老链表
pold_list = pold_list->next;//移动,即 pold_list = pold_list->next->next;
if(pold_list != NULL)
pnew_list->next = pold_list->next;
pnew_list = pnew_list->next;//移动,即 pnew_list = pnew_list->next->next;
}
return final_list;
}
};