复杂链表的复制(Java实现)
作者:互联网
1.题目
2.解法
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
if(pHead == null) {
return null;
}
RandomListNode curNode = pHead;
RandomListNode nextNode = null;
//1、复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
while (curNode != null) {
RandomListNode cloneNode = new RandomListNode(curNode.label);
nextNode = curNode.next;
cloneNode.next = nextNode;
curNode.next = cloneNode;
curNode = nextNode;
}
curNode = pHead;
//2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
while(curNode != null) {
// 为什么是random.next,因为原结点后面紧跟复制的结点
curNode.next.random = (curNode.random == null ? null : curNode.random.next);
curNode = curNode.next.next;
}
//3、拆分链表,将链表拆分为原链表和复制后的链表
curNode = pHead;
RandomListNode cloneHead = pHead.next;
RandomListNode cloneNode = null;
while (curNode != null) {
cloneNode = curNode.next;
curNode.next = cloneNode.next;
// 如果cloneNode.next为空的话
cloneNode.next = (cloneNode.next == null ? null : cloneNode.next.next);
curNode = curNode.next;
}
return cloneHead;
}
}
时间复杂度为O(3n),空间复杂度为O(n)
标签:结点,RandomListNode,Java,cloneNode,next,链表,复制,null,curNode 来源: https://blog.csdn.net/wuprogrammer/article/details/104885962