[Leetcode]138. 复制带随机指针的链表
创始人
2024-01-22 12:18:04
0

目录

1.题目链接

2.1解法①(暴力)

2.1.1解法思路:

2.1.2代码实现:

2.2解法②(进阶)

2.1.1解法思路:

2.2.2代码实现:


1.题目链接

138. 复制带随机指针的链表 - 力扣(LeetCode)

2.1解法①(暴力)

2.1.1解法思路:

时间复杂度:O(N^2) 空间复杂度O(N); 

①先遍历原链表,复制出一个一模一样的单链表,先不管random的问题;

②然后再遍历新生成的链表,同时进行random指针的拷贝:

这个实现是对于新生成的每一个节点,然后找到原链表的对应的节点,然后遍历原链表找出原链表对应的random指针指向的节点,计算random指向的节点和原链表中对应的节点的相对位置i;

然后在新生成的单链表中找到相同相对位置的节点,然后再将新生成的单链表中的该节点的random指向这个相对位置对应的节点。

2.1.2代码实现:

struct Node* BuyNode(int x)
{struct Node* New = (struct Node*)malloc(sizeof(struct Node));New->val = x;New->next = NULL;New->random = NULL;return New;
}int CheckList(struct Node* head, struct Node*cur)
{int x = 0;while(cur->random != head){head = head->next;x++;}return x;
}
struct Node* copyRandomList(struct Node* head)
{struct Node* cur = head;struct Node* temp = BuyNode(-1);struct Node* pre = temp;//先复制单链表while(cur){temp->next = BuyNode(cur->val);temp = temp->next;cur = cur->next;}//复制随机指针//1遍历原链表,遇到随即指针不为空的节点;//2然后再遍历链表找到随即指针指向的节点,计算位置;//3然后放入新的链表中temp = pre->next;//初始化新链表箭头cur = head;//初始化旧链表指针while(cur){if(cur->random != NULL){int x = CheckList(head, cur);struct Node* shead = pre->next;for(int i = 0; i < x; i++){shead = shead->next;}temp->random = shead;}cur = cur->next;temp = temp->next;}return pre->next;
}

2.2解法②(进阶)

2.1.1解法思路:

①先进行如下的操作:

在每个节点后面插入一个新的节点然后每个节点的val和前一个节点相同;

 ②然后要做的就是处理新插入节点的random指针,进行第一步的操作就是为了方便第二步来处理random指针的:具体实现的方法就是给定一个指针cur来遍历原来就有的节点,然后遇到random指针不为空的节点,然后就将其next的random指向其的random的next即可;

(这个是最关键的)实现如下的效果;

 ③第三步也是最后一步,然后将那些在原链表上插入的新节点按顺序,尾插成一个新的链表;

2.2.2代码实现:

struct Node* BuyNode(int x)
{struct Node* New = (struct Node*)malloc(sizeof(struct Node));New->val = x;New->next = NULL;New->random = NULL;return New;
}struct Node* copyRandomList(struct Node* head)
{struct Node* cur = head; //先复制单链表while(cur){struct Node* cnext = cur->next;struct Node* New = BuyNode(cur->val);cur->next = New;New->next = cnext;cur = cur->next->next;}//给定randomcur = head;while(cur){if(cur->random){cur->next->random = cur->random->next;}cur = cur->next->next;}//生成新链表cur = head;struct Node* Bhead = (struct Node*)malloc(sizeof(struct Node));Bhead->next = NULL;struct Node* tail = Bhead;int x = 1;while(cur){if(x % 2 == 0){tail->next = cur;tail = tail->next;}x++;cur = cur->next;}return Bhead->next;
}

以上就是本博客的所有内容了!

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...