一.题目及剖析
https://leetcode.cn/problems/copy-list-with-random-pointer/
这个题目的意思就是拷贝一份复杂链表,难点在于它的random指针所指向的空间与拷贝下来的链表之间缺少一种联系,当然可以用遍历链表的方式通过value去找那块空间,不过时间复杂度太高.
二.思路引入
所以这道题的重中之重就是怎样让拷贝链表地random和原链表以及之间产生联系
我们不妨引入这样一种方法,在原链表每个节点的后面创建一个新的节点,该节点的值与上个节点相同,这样我们新节点的random指向的空间就是原节点的random指向空间的下一块空间,最后再将新节点从原链表中截下来,并恢复原链表.
三.代码引入
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) {
Node* pcur = head;
//在每个节点后面再插入一个相同的节点
while(pcur)
{
Node* copy = (Node*)malloc(sizeof(Node));
copy->val = pcur->val;
copy->next = pcur->next;
pcur->next = copy;
pcur = pcur->next->next;
}
pcur = head;
//处理random指针指向的节点(copy->random == pcur->random->next)
while(pcur)
{
Node* copy = pcur->next;
if(pcur->random == NULL)
copy->random = NULL;
else
copy->random = pcur->random->next;
pcur = pcur->next->next;
}
pcur = head;
Node* newhead = NULL, * newtail = NULL;
//将对应节点放到新链表中
while(pcur)
{
Node* next = pcur->next;
pcur->next = next->next;
if(newtail == NULL)
newhead = newtail = next;
else
{
newtail->next = next;
newtail = newtail->next;
}
pcur = pcur->next;
}
return newhead;
}