/*
* 输入一个复杂链表(每个节点中有节点值,以及两个指针,
* 一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
*(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
* 注:本题分三步走:第一步先复制链表;第二部根据复制链表的特点,对新链表关联上随机节点;第三步拆分链表
*/
class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null; //相比普通链表多了随机指向的节点
RandomListNode(int label) {
this.label = label;
}
}
public class ComplicatedListClone {
public RandomListNode clone(RandomListNode pHead) {
//复制链表:由A->B->C变成A->A'->B->B'->C->C'
if(pHead == null)
return null;
RandomListNode pCur = pHead;
//循环操作要画图才能理解
while(pCur != null) {
RandomListNode pTemp = new RandomListNode(pCur.label);
pTemp.next = pCur.next;
pCur.next = pTemp;
pCur = pTemp.next;
}
//给复制后的链表添加随机节点指向
pCur = pHead;
while(pCur != null) {
if(pCur.random != null) {
pCur.next.random = pCur.random.next;
}
pCur = pCur.next.next;
}
//拆分链表
RandomListNode copyHead = pHead.next;
RandomListNode copyCur = copyHead;
pCur = pHead;
while(pCur != null) {
pCur.next = pCur.next.next;
if(copyCur.next != null) {
copyCur.next = copyCur.next.next;
}
pCur = pCur.next;
copyCur = copyCur.next;
}
return copyHead;
}
public static void main(String[] args) {
RandomListNode node = new RandomListNode(1);
node.next = new RandomListNode(2);
node.next.next = new RandomListNode(3);
RandomListNode resultNode = new ComplicatedListClone().clone(node);
RandomListNode temp = resultNode;
while(temp != null) {
System.out.print(temp.label + " ");
temp = temp.next;
}
}
}
《剑指offer》-复杂链表的复制
最新推荐文章于 2022-02-28 16:44:11 发布