复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向链表中任意一个节点)。链表的数据结构为

public class RandomListNode {

    public int label;
    public RandomListNode next = null;
    public RandomListNode random = null;

    public RandomListNode(int label) {
        this.label = label;
    }

}

思路:首先复制next节点,然后复制random节点。
方法一:在复制节点的时候,将原节点A和复制节点A’加入到HashMap (A,A’)当中保存,然后复制random节点时,遍历原链表,当原节点存在random节点时,则从HashMap当中找出复制节点的random’节点。
方法二:如图所示为原链表
这里写图片描述
第一步复制节点
这里写图片描述
第二步复制random节点
这里写图片描述
第三步拆分
这里写图片描述

方法一:

public RandomListNode Clone(RandomListNode pHead){

        if(pHead==null){
            return null;
        }

        RandomListNode head=new RandomListNode(pHead.label);
        RandomListNode piterator=pHead;
        RandomListNode iterator=head;
        //复制next指针
        HashMap<RandomListNode,RandomListNode> map=new HashMap<RandomListNode,RandomListNode>();
        map.put(piterator, iterator);
        while(piterator.next!=null){
            iterator.next=new RandomListNode(piterator.next.label);
            iterator=iterator.next;
            piterator=piterator.next;
            map.put(piterator, iterator);
        }
        //复制random指针
        piterator=pHead;
        iterator=head;
        while(piterator!=null){
            if(piterator.random!=null){
                iterator.random=map.get(piterator.random);
            }
            iterator=iterator.next;
            piterator=piterator.next;
        }

        return head;
    }

方法二:

public RandomListNode Clone(RandomListNode pHead){
        if(pHead==null){
            return null;
        }
        RandomListNode piterator=pHead;
        //合并
        while(piterator!=null){
            RandomListNode node=new RandomListNode(piterator.label);
            node.next=piterator.next;
            piterator.next=node;
            piterator=node.next;
        }
        //random指针复制
        piterator=pHead;
        while(piterator!=null){
            if(piterator.random!=null){
                piterator.next.random=piterator.random.next;
            }
            piterator=piterator.next.next;
        }

        //拆分
        piterator=pHead;
        RandomListNode head=pHead.next;
        RandomListNode iterator=head;
        while(piterator!=null){
            piterator.next=iterator.next;
            piterator=piterator.next;
            if(piterator!=null){
                iterator.next=piterator.next;
                iterator=iterator.next;
            }
        }

        return head;
    }
posted @ 2016-05-04 15:55  黄大仙爱编程  阅读(82)  评论(0编辑  收藏  举报