题目:实现一个函数复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点之外,还有一个random指针指向链表的任意结点或者null
分析:有很多思路,剑指offer都有讲解。最优思路是分为三步,第一步,复制原始链表的任意结点N并创建新结点N',再把N'连接到N的后面;第二步,设置复制出来的结点的random指针;第三步,将长链表拆分为两个链表
public class wr26copyList { public RandomListNode Clone(RandomListNode pHead){ if(pHead==null){ return null; } RandomListNode curNode=pHead; // 第一步,复制原始链表的任意结点N并创建新结点N',再把N'链接到N的后面 while(curNode!=null){ RandomListNode cloneNode=new RandomListNode(curNode.label); cloneNode.next=curNode.next; curNode.next=cloneNode; curNode=cloneNode.next; } // 第二步,设置复制出来的结点的random指针 curNode=pHead; while(curNode!=null){ if(curNode.random!=null){ curNode.next.random=curNode.random.next; } curNode=curNode.next.next; } // 第三步,将长链表拆分为两个链表 curNode=pHead; RandomListNode cloneHead=pHead.next; RandomListNode cur=cloneHead; while(curNode!=null){ curNode.next=curNode.next.next; if(cur.next!=null){ cur.next=cur.next.next; } cur=cur.next; curNode=curNode.next; } return cloneHead; } }