题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
基本结构:
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
解法1:
先复制整个有序链表(不包含随机指向节点),然后利用链表遍历到正确的位置,时间复杂度为O(n^2)
解法2:
先复制整个有序链表,同时将复制的节点和原来的节点利用哈希表(key, value)形式存储,时间复杂度为O(n),利用控件换取时间
解法3:
先复制整个有序链表的每一个节点到原节点的下位,然后连接随机指向节点,最后将长链表分割为两个链表,即可。假设原始链表上的N的随机指向节点为S,那么其赋值出来的节点N'的随机指向节点对应为S',即S的下位,时间复杂度为O(n)
A >> A' >> B >> B' >> C >> C'
代码如下:
public RandomListNode Clone(RandomListNode pHead) {
if (pHead == null){
return null;
}
RandomListNode result = null;
RandomListNode temp = pHead;
RandomListNode tempResult = result;
//复制链表每一个节点到原来节点的后边
while(temp != null){
RandomListNode pNew = new RandomListNode(temp.label);
pNew.next = temp.next;
pNew.random = null;
temp.next = pNew;
temp = pNew.next;
}
//设置随机节点
temp = pHead;
while (temp != null){
RandomListNode pNew = temp.next;
if (temp.random != null){
pNew.random = temp.random.next;
}
temp = pNew.next;
}
//分解成为两个链表
temp = pHead;
while (temp != null){
RandomListNode pNew = temp.next;
temp.next = pNew.next;
temp = temp.next;
if (result == null){
result = pNew;
tempResult = result;
}else{
tempResult.next = pNew;
tempResult = tempResult.next;
}
}
return result;
}