/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
/*
本题题意是对链表进行深度复制,这里的难度主要是随机指针的问题。这里采用如下步骤求解该题:
1.在原始链表每个节点的后面,插入与当前结点一样值的节点。
2.修改每个插入结点的随机指针。
3.分开新旧链表。
参考自:https://github.com/soulmachine/leetcode
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
//1.在每个节点后面插入同样结点
RandomListNode *cur(head);
while(cur != nullptr){
RandomListNode *tmp = new RandomListNode(cur->label);
tmp->next = cur->next;
cur->next = tmp;
cur = cur->next->next;
}
//2.修改新插入结点的随机指针
cur = head;
while(cur != nullptr){
if(cur->random != nullptr){
cur->next->random = cur->random->next;
}
cur = cur->next->next;
}
//3.拆开两个单链表
cur = head;
RandomListNode newHead(-1), *new_cur(&newHead);
while(cur != nullptr){
new_cur->next = cur->next;
new_cur = new_cur->next;
cur->next = cur->next->next;
cur = cur->next;
}
return newHead.next;
}
};LeetCode之Copy List with Random Pointer
最新推荐文章于 2022-01-16 16:26:50 发布
本文详细介绍了如何通过在原始链表每个节点后面插入相同值的节点并修改随机指针来实现链表的深度复制。通过两步操作:首先在每个节点后面插入同样值的节点;然后修改新插入节点的随机指针;最后将新旧链表分开,从而完成深度复制过程。此方法巧妙地解决了随机指针带来的复杂性。
1287

被折叠的 条评论
为什么被折叠?



