该题要求我们对一个随机链表进行拷贝,其实对一个链表进行拷贝并不难,但是该随机链表节点random指向的随机节点难以复制,这也是这题的主要难点。
1.我们首先要做就是拷贝下原链表的节点,然后将其插入原链表中。
2.接下来我们按照原链表random的指向处理复制链表中的random,这是该题最为重要的一步。
3.将复制链表与原链表分离。
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head)
{
//拷贝节点插入到原链表
if(head == NULL)
{
return NULL;
}
Node* cur = head;
while(cur)
{
Node* copynode = (Node*)malloc(sizeof(Node));
copynode->val = cur->val;
copynode->next = cur->next;
cur->next = copynode;
cur = copynode->next;
}
//链接random
cur = head;
while(cur)
{
Node* copynode = cur->next;
if(cur->random == NULL)
{
copynode->random = NULL;
}
else
{
copynode->random = cur->random->next;
}
cur = copynode->next;
}
//将复制链表剪下来
cur = head;
Node* newhead = NULL, *newtail = NULL;
while(cur)
{
Node* copynode = cur->next;
Node* next = copynode->next;
if(newtail == NULL)
{
newhead = newtail = copynode;
}
else
{
newtail->next = copynode;
newtail = copynode;
}
cur = next;
}
return newhead;
}
时间复杂度 O(N)
空间复杂度 O(N)
拜拜,下期再见😏
摸鱼摸鱼😴✨🎞