如何定位random节点?
-- HashMap
---相同元素的下一个位置
三步走:
- 复制每个节点到相同节点的下一个位置:
链表插入 - 复制随机指针:存在的话就是cur.random.next
- 拆分,返回head.next,核心过程:
cur=cur.next.next
大佬的图解:来源:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/fu-za-lian-biao-de-fu-zhi-jian-dan-yi-dong-de-san-/
/**
* 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),
* 请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
* @param pHead 复杂链表
* @return 并返回深拷贝后的头结点
*/
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null){
return null;
}
RandomListNode cur=pHead;
while (cur!=null){
RandomListNode node=new RandomListNode(cur.label);
node.next=cur.next;
cur.next=node;
cur=cur.next.next;//下一个原链接的节点。
}
cur=pHead;
while (cur!=null&&cur.next!=null){
cur.next.random=cur.random==null?null:cur.random.next;//式中在下一个位置!!!
cur=cur.next.next;
}
RandomListNode head=pHead.next;
RandomListNode curOldList=pHead;
RandomListNode curNewList=head;
while (curOldList!=null){
curOldList.next=curOldList.next.next;
curNewList.next=curNewList.next==null?null:curNewList.next.next;
curOldList=curOldList.next;
curNewList=curNewList.next;
}
return head;
} 


京公网安备 11010502036488号