链表OJLeetcode 138. 复制带随机指针的链表(集大成者)
Posted Bitdancing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表OJLeetcode 138. 复制带随机指针的链表(集大成者)相关的知识,希望对你有一定的参考价值。
解题思路
此题可以分为三步进行:
- 拷贝链表的每一个结点,拷贝的结点先链接到被拷贝结点后面
- 复制随机指针的链接:拷贝结点的随机指针指向被拷贝结点随机指针的下一个位置
- 拆解链表,把拷贝的链表从原链表中拆解出来
第一步
拷贝链表的每一个结点,拷贝的结点先链接到被拷贝结点后面。
需要注意 copy 结点插入时,指针先后顺序。避免结点 脱钩。
// 将新结点插入到原链表每一个结点后面
struct Node* cur = head;
while(cur)
{
struct Node* copy = BuyListNode(cur->val);
struct Node* next = cur->next;
copy->next = next;
cur->next = copy;
// 迭代
cur = next;
}
第二步
复制随机指针的链接:拷贝结点的随机指针指向被拷贝结点随机指针的下一个位置。
注意看蓝色画图部分,即为如何查找到random指针。
最终链接结果
// 根据原结点的random,处理复制结点的random
cur = head;
while(cur)
{
struct Node* copy = cur->next, *next = copy->next;
if(cur->random == NULL)
copy->random = NULL;
else
copy->random = cur->random->next;
cur = next;
}
第三步
拆解链表,把拷贝的链表从原链表中拆解出来。
这里使用不带哨兵位的链表构造方法带哨兵位讲解指路 :分割链表
// 解绑新结点,恢复旧链表连接关系
struct Node* newhead, *newtail;
newhead = newtail = NULL;
cur = head;
while(cur)
{
struct Node* copy = cur->next, *next = copy->next;
// 对新链
if(newhead == NULL)
{
newhead = copy;
newtail = copy;
}
else
{
newtail->next = copy;
newtail = copy;
}
// 对旧链
cur->next = next;
cur = next;
}
具体实现思路和尾插结点无异,不会的可以看这一篇 不带哨兵位单向链表
AC程序
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
struct Node* BuyListNode(int x) {
struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
copy->val = x;
copy->random = NULL;
copy->next = NULL;
return copy;
}
struct Node* copyRandomList(struct Node* head) {
// 将新结点插入到原链表每一个结点后面
struct Node* cur = head;
while(cur)
{
struct Node* copy = BuyListNode(cur->val);
struct Node* next = cur->next;
copy->next = next;
cur->next = copy;
cur = next;
}
// 根据原结点的random,处理复制结点的random
cur = head;
while(cur)
{
struct Node* copy = cur->next, *next = copy->next;
if(cur->random == NULL)
copy->random = NULL;
else
copy->random = cur->random->next;
cur = next;
}
// 解绑新结点,恢复旧链表连接关系
struct Node* newhead, *newtail;
newhead = newtail = NULL;
cur = head;
while(cur)
{
struct Node* copy = cur->next, *next = copy->next;
// 对新链
if(newhead == NULL)
{
newhead = copy;
newtail = copy;
}
else
{
newtail->next = copy;
newtail = copy;
}
// 对旧链
cur->next = next;
cur = next;
}
return newhead;
}
以上是关于链表OJLeetcode 138. 复制带随机指针的链表(集大成者)的主要内容,如果未能解决你的问题,请参考以下文章