相同元素的下一位位置实现定位!!
复杂链表的复制
http://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba
如何定位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; }