25 图解剑指Offer 复杂链表的复制 Java题解
题目链接
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
题解:
(1)如果链表为null,则返回null
(2)如果链表不为null,则创建一个新的头节点,两个指针,一个指向老链表当前节点,另一个指向新链表当前节点。
(3) 当老链表的当前节点不为null时,遍历链表每次将老链表的next和random赋值给新节点,如果next或random为null则赋值null。
(4)最后返回新链表的头节点
(5)链表多遍历 和用cuur作为辅助指针,一般指向当前节点,一开始cuur和newCuur都指向新老链表的头节点,每次遍历,cuur和newCuur都指向下一个节点。
图解:
代码:
/*
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)
{
//如果链表为null,则返回null
if(pHead == null) return null;
//如果链表不为null,则创建一个新的头节点,两个指针,一个指向老链表当前节点,另一个指向新链表当前节点。
RandomListNode newHead = new RandomListNode(pHead.label);
RandomListNode cuur = pHead;
RandomListNode newCuur = newHead;
//当老链表的当前节点不为null时,遍历链表每次将老链表的next和random赋值给新节点,如果next或random为null则赋值null。
while(cuur != null){
newCuur.next = cuur.next == null ? null : new RandomListNode(cuur.next.label);
newCuur.random = cuur.random == null ? null : new RandomListNode(cuur.random.label);
cuur = cuur.next;
newCuur = newCuur.next;
}
//最后返回新链表的头节点
return newHead;
}
}
复杂度
空间复杂度: O(n) 和链表节点个数有关
时间复杂度:O(n) 和链表节点个数有关