您的位置:首页 > 其它

复杂链表的复制

2016-05-04 15:55 253 查看
题目描述

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: