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.
这是照着这个思路写的http://www.2cto.com/kf/201401/276086.html,很详细,主要分三步:
第一步:在原始链表上每一个节点后面插入一个跟此节点相同的节点;
第二步:依次复制随机指针;
第三步:将生成的链表拆成两部分。
代码如下:
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == NULL)
return NULL;
copyNext(head);
copyRandomPtr(head);
return divList(head);
}
void copyNext(RandomListNode *head)
{
RandomListNode *tHead = head;
RandomListNode *next = NULL;
while (tHead)
{
next = tHead->next; //这是原始链表的下一个节点
RandomListNode *tmpNode = new RandomListNode(tHead->label); //创建一个新的此节点
tmpNode->next = tHead->next; //此节点的下一个节点也是原始链表的下一个节点
tHead->next = tmpNode; //将此节点链接到原始链表的节点中
tHead=next; //头指向原始链表的下一个节点
}
}
void copyRandomPtr(RandomListNode *head) //复制随机指针
{
RandomListNode *tHead = head;
while (tHead)
{
if (tHead->random)
tHead->next->random = tHead->random->next;
tHead = tHead->next->next;
}
}
RandomListNode * divList(RandomListNode *head) //分离链表
{
RandomListNode *tHead = head;
RandomListNode *retList=NULL;
RandomListNode *tRet;
RandomListNode *next;
while (tHead)
{
if (retList==NULL) //如果返回的链表为空,那么就设置链表头
{
next = tHead->next->next; //赋值原始链表的下一个节点
retList = tHead->next; //设置返回的链表头
tRet = retList; //用这个临时链表去操作
tHead->next=next; //链接原始链表的下一个
tHead=next; //指向原始链表的下一个
}
else
{
next = tHead->next->next;
tRet->next=tHead->next; //返回链表的下一个就是原始链表的下一个,因为这时候返回链表的指向在原始链表的前面
tHead->next=next;
tHead=next;
tRet = tRet->next;
}
}
return retList;
}
};