随机链表的复制
1、题目描述
https://leetcode.cn/problems/copy-list-with-random-pointer
2、思路分析
第一步、在原链表的基础上拷贝节点
第二步、置random指针
只要节点不为空,那么就满足以下这个结论:copy -> random = cur -> random -> next
第三步、断开新旧链表
定义指针pcur指向原链表的头结点,用来遍历整个链表,再定义拷贝链表的头尾指针copyHead和copyTail。
3、参考代码
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
typedef struct Node Node;
Node* buyNode(int x)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = x;
newNode->next = newNode->random = NULL;
return newNode;
}
void AddNode(Node* head)
{
Node* pcur = head;
while(pcur)
{
Node* newnode = buyNode(pcur->val);
Node* next = pcur->next;
newnode->next = next;
pcur->next = newnode;
pcur = next;
}
}
void setRandom(Node* head)
{
Node* pcur = head;
while(pcur)
{
Node* copy = pcur->next;
if(pcur->random)
{
copy->random = pcur->random->next;
}
pcur = copy->next;
}
}
struct Node* copyRandomList(struct Node* head)
{
if(head == NULL)
{
return head;
}
//在原链表的基础上拷贝节点并插入到原链表中
AddNode(head);
//设置random指针
setRandom(head);
//断开新链表
Node* pcur = head;
Node* copyHead, *copyTail;
copyHead = copyTail = pcur->next;
while(copyTail->next)
{
pcur = copyTail->next;
copyTail->next = pcur->next;
copyTail = copyTail->next;
}
return copyHead;
}