复制带随机指针的链表(LeetCode)
题目描述:
解题思路:
- 大致思路如下:
- (1)将复制节点添加到原节点后面
- (2)复制random节点
- (3)分离链表
代码如下所示:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head)
{
if (head == nullptr)
{
return head;
}
Node *cur = head;
//1. 将复制节点添加到原节点后面
while (cur != nullptr)
{
Node *copy = new Node(cur->val, nullptr, nullptr);
copy->next = cur->next;
cur->next = copy;
cur = copy->next;
}
//2. 复制random节点
cur = head;
while (cur != nullptr)
{
if (cur->random != nullptr)
{
cur->next->random = cur->random->next;
}
cur = cur->next->next;
}
//3. 分离链表
cur = head;
Node *newHead = head->next;
Node *newNode = newHead;
while (cur != nullptr)
{
cur->next = cur->next->next;
if (newNode->next != nullptr)
{
newNode->next = newNode->next->next;
}
cur = cur->next;
newNode = newNode->next;
}
return newHead;
}
};
复杂链表的复制(NowCoder)
题目描述:
解题思路:
- 在看到这个题之后,很容易就可以想到的方法是把复制的过程分为两个步骤:第一步是复制原始链表上的每一个结点,并且用next的指针连接起来,第二步是设置每个结点的随机指针,假设原始链表中的某个结点N的随机指针指向的是S,由于S在链表中可能在结点N的前面,也可能在结点N的后面所以要定位S的位置需要从原始链表的头结点开始进行查找的操作。如果从原始链表的头节点开始进行查找的操作的话,就会从头节点经历s步到达结点S,那么复制链表上随机指针也是需要走s步的