import java.util.*;
//复制含有随机指针的链表
public class CopyList{
//链表节点的定义
public static class Node{
public int value;
public Node next;
public Node rand;
public Node(int data)
{
this.value=data;
}
}
//复制链表(利用hash表保存原节点和复制节点的关系)
public static Node Copylist(Node head)
{
if(head==null)
{
return head;
}
HashMap<Node,Node>map=new HashMap<Node,Node>();
Node cur=head; //记录头节点
while(cur!=null)
{
map.put(cur,new Node(cur.value)); //复制cur节点
cur=cur.next;
}
cur=head;
while(cur!=null)
{
map.get(cur).next=map.get(cur.next);
map.get(cur).rand=map.get(cur.rand);
cur=cur.next;
}
return map.get(head);
}
//进阶解法 (空间复杂度O(1))
public static Node opylist2(Node head)
{
if(head==null)
{
return head;
}
Node cur=head;
Node next=null;
//复制并链接每一个节点
while(cur!=null)
{
next=cur.next;
cur.next=new Node(cur.value);
cur.next.next=next;
cur=next;
}
cur=head;
Node curcopy=null;
//设置复制节点的rand指针
while(cur!=null)
{
next=cur.next.next;
curcopy=cur.next;
curcopy.rand=cur.rand!=null?cur.rand.next:null;
cur=next;
}
Node res=head.next;
cur=head;
//拆分
while(cur!=null)
{
next=cur.next.next;
curcopy=cur.next;
cur.next=next;
curcopy.next=next!=null?next.next:null;
cur=next;
}
return res;
}
//打印链表
public static void PrintList(Node head)
{
while(head!=null)
{
System.out.print(head.value+" ");
//if(head.rand!=null){
// System.out.print(head.rand.value+" ");
//}
head=head.next;
}
}
public static void main(String []args)
{
//System.out.println("Hello");
Node node=new Node(1);
node.next=new Node(2);
node.next.next=new Node(3);
node.rand=node.next.next;
node.next.rand=null;
node.next.next.rand=node;
//Node mode=Copylist2(node);
Node mode=Copylist2(node);
PrintList(mode);
}
}