算法学习17-复制含有随机指针节点的链表(深度拷贝)

本文介绍如何复制一个特殊的链表,其中每个节点包含一个值、一个指向下一个节点的指针和一个随机指针,该指针可能指向链表中的任意节点或null。提供了普通解法和进阶算法,保证在O(N)的时间复杂度内完成复制,且不使用额外数据结构。
摘要由CSDN通过智能技术生成

复制含有随机指针节点的链表

【题目】一种特殊的链表节点类描述如下:

java结构如下

public class Node{
   
	public intvalue;
	public Nodenext;
	public Noderand;
	public Node(intdata){
   
		this.value=data;
}

c++结构如下

struct Node
{
   
    int value;
    Node *next;
    Node *rand;
};

Node类中的value是节点值,next指针和正常单链表中next指针的意义一样,都指向下一个节点,rand指针是Node类中新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点head,请实现一个函数完成这个链表中所有结构的复制,并返回复制的新链表的头节点。进阶:不使用额外的数据结构,只用有限几个变量,且在时间复杂度为O(N)内完成原问题要实现的函数。

(RandomListNode类中的label是节点值,next指针和正常的单链表指针中的next指针的意义一样,都指向下一个节点,random指针是RandomListNode类中的新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向NULL。给定一个由RandomListNode节点类型组成的五环单链表的头节点pHead,请实现一个函数完成这个链表中所有结构的复制,并返回复制的新链表的头节点)。

图解算法

深度拷贝
在这里插入图片描述

普通解法

可以做到时间复杂度为O(N),空间复杂度为O(N)。

代码实现

#include <iostream>
#include <hash_map>

using namespace std;
using namespace __gnu_cxx;

struct Node
{
   
    int value;
    Node *next;
    Node *rand;
};

//使用hash_map所需要的hash函数
struct hash_Node
{
   
    size_t operator() (const Node &node) const
    {
   
        return node.value;
    }
};

//使用hash_map所需要的比较函数
struct compare_Node
{
   
    bool operator() (const Node &n1,const Node &n2) const
    {
   
        return n1.value == n2.value && n1.next == n2.next && n1.rand == n2.rand;
    }
};

//使用hash_map解决问题
Node* copyListWithRand(Node *head)
{
   
    hash_map<Node,Node,hash_Node,compare_Node> map;
    Node *cur = head;
    while(NULL != cur)
    {
   
        Node *ptr = new Node;
        ptr->value = cur->value;
        ptr-</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值