复制含有随机指针节点的链表
【题目】一种特殊的链表节点类描述如下:
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-</