一:问题描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
二,分析
先举个栗子,有如下链表,每个节点除了指向下个节点的next指针,还有一个random指针,其中,3的random指针指向他自己
我们先做一个指针,叫kk,让他指向头节点
kk=pHead
如果kk不为空,就复制一个出来,叫他node
node=RandomListNode(kk.label)
用next指针连接起node和kk以及kk.next
node.next=kk.next
kk.next=node
下一个
kk=node.next
直到复制了链表中的所有结点,并用next将他们连接起来
第二步,复制random指针
1结点的random指向5
复制出来的1的random就该指向复制出来的5
此时,复制出来的5是原来的5的下一项
kk.random.next=kk.next.random
one by one直到全部复制完成
第三步,分离两个链表
再做两个新的指针,一个叫ee,指向新链表的表头,就放那不动,等着输出
一个叫nn,他负责遍历新链表,而kk负责遍历旧的链表
让旧的指向旧的,新的指向新的
kk.next=kk.next.next
nn.next=nn.next.next
最后输出ee
结束
三,代码