复制含有随机指针的链表

来源:互联网 发布:xp连接win7网络打印机 编辑:程序博客网 时间:2024/05/10 06:40

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);}}


原创粉丝点击