//链表 随机指针 复制
#include<iostream>
#include<ctime>
#include<vector>
#include<cstdlib>
using namespace std;
class CNode
{
public:
int value;
CNode* next;
CNode* rand;
CNode(int v);
~CNode();
};
CNode::CNode(int v):value(v),next(0),rand(0){}
CNode::~CNode()
{
cout<<"~CNode()"<<endl;
}
void buildRand(CNode* clink)
{
int lenOfclink=0;//计算clink的长度
vector<CNode*> vc;//并记录指针
CNode* p=clink;
while(p)
{
vc.push_back(p);
p=p->next;
lenOfclink++;
}
//长度为1
if(lenOfclink==1)
{
clink->rand=clink;
return;
}
else
{
p=clink;
while(p)
{
p->rand=vc[rand()%lenOfclink];
p=p->next;
}
}
}
void append(CNode* clink,int v)
{
CNode* p=clink;
while(1)
{
if(p->next==0)
{
p->next=new CNode(v);
break;
}
else
{
p=p->next;
}
}
}
void print(CNode* clink)
{
CNode* p=clink;
while(p)
{
cout<<"p->value:"<<p->value<<"\n";
if(p->next)
{
cout<<"p->next->value:"<<p->next->value<<"\tp->rand->value:"<<p->rand->value<<endl;
p=p->next;
}
else
{
break;
}
}
}
void copyLink(CNode* src,CNode* &des)
{
CNode* p=src,*temp;
//复制双份src
while(p)
{
temp=p->next;
//复制一个p
p->next=new CNode(p->value);
p->next->next=temp;
p=temp;
}
//复制rand
p=src;
while(p)
{
p->next->rand=p->rand->next;
p=p->next->next;
}
//分离
des=src->next;
p=src;
while(p)
{
temp=p->next;
p->next=p->next->next;
if(temp->next)
temp->next=temp->next->next;
p=p->next;
}
}
int main(int args,char* argv[])
{
//播种
srand(time(0));
CNode* clink=new CNode(1);
append(clink,2);
append(clink,3);
append(clink,4);
append(clink,5);
buildRand(clink);
print(clink);
cout<<endl<<endl;
CNode* des=0;
copyLink(clink,des);
print(des);
return 0;
}
分享到:
相关推荐
标题“拷贝具有随机指针节点的链表”涉及到的主要知识点是链表的复制,特别是对于带有随机指针的链表。在链表复制的过程中,我们需要保留原始链表的所有信息,包括常规的next指针以及随机指针。由于随机指针的存在,...
题目要求实现一个函数`copyRandomList`,用于复制一个带有随机指针的链表。链表的节点结构定义如下: ```c typedef struct Node { int val; // 节点值 struct Node *next; // 普通指针,指向下一个节点 struct ...
复制带随机指针的链表1
复制带随机指针的链表.md
### 复制带随机指针的链表 #### 问题背景 在计算机科学中,链表是一种常见的数据结构,用于存储一系列元素。每个元素(通常称为节点)包含一个指向链表中下一个节点的指针。然而,在某些情况下,链表中的每个节点...
Leetcode 138. 复制带随机指针的链表问题描述138. 复制带随机指针的链表 - 力扣(LeetCode)算法解法1:hashtab解法1: 实现解法
在本压缩包中,我们关注的是一个Python编程与算法面试相关的题目,具体是LeetCode的第138题——“复制带有随机指针的链表”。这个题目涉及到链表数据结构以及链表操作,是很多技术面试中常见的问题,尤其对于Python...
题目要求我们复制一个具有额外随机指针的链表,其中每个节点不仅有指向下一个节点的指针,还可能有一个随机指针指向链表中的其他节点或为 NULL。 在提供的解决方案中,采用了以下步骤来完成复杂链表的复制: 1. **...
简介:给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。返回复制链表的头节点。题解 1 - typ
使用随机指针复制链表 给出一个链表,使得每个节点都包含一个额外的随机指针,该指针可以指向链表中的任何节点或为空。 返回列表的深层副本。 链表在输入/输出中表示为 n 个节点的列表。 每个节点都表示为一对 [val,...
思路:直接法第一遍遍历给定链表,创建一个相同val拷贝链表用一个哈希表把给定链表的每个节点和他的index对应,便于之后找random对应的节点的index用另
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝。 我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, ...
【描述】:这个题目主要涉及到链表操作,特别是复制一个具有随机指针的链表。我们需要遵循三步走的策略来完成这个任务。 【标签】:“链表” 【部分内容】:这段代码提供了一个解决复杂链表复制问题的算法,具体...
这个题目要求我们复制一个具有额外随机指针的链表。每个节点除了拥有常规的`next`指针指向下一个节点之外,还有一个`random`指针可以随机指向链表中的任意节点。我们的任务是复制整个链表,包括复制节点和复制这些`...
1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面 2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.ran
有一个链表L,其中每个节点包含1 个数据域和2 个指针。一个指针next 指 向链表的下个节点,另一个random 随机指向...要求编写一个程序,首先完成链表的构造,然后复制这个链表的结构,新的链表具有和原链表相同的结构。
复杂链表是一种特殊的链表结构,它的每个结点不仅有一个指向下一个节点的指针,还有一个随机指针域,该指针域可以指向链表中的任意一个节点或为空结点。这种链表结构使得链表的操作变得更加复杂。 二、复杂链表的...
9. **复制链表**:创建链表的深拷贝,包括每个节点的数据和指针都要复制。 10. **链表长度**:计算链表中节点的数量,通过遍历链表直到找到空指针即可。 11. **打印链表**:按照顺序输出链表中所有节点的值,这...
剑指 Offer 35. 复杂链表的复制标签:哈希表、链表难度:中等题目大意给定一个链表,每个节点除了 next 指针之后,还包含一个随机指针 random,该
【Q138 复制带随机指针的链表】是深拷贝链表的问题。我们创建一个映射表,存储旧节点到新节点的对应关系。先复制链表本身,然后再处理随机指针,通过映射表找到对应的新节点。 【Q142 环形链表 II】要求找到环形...