JZ25 复杂链表的复制
原题链接
描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。
示例
输入:{1,2,3,4,5,3,5,#,2,#}
返回值:{1,2,3,4,5,3,5,#,2,#}
思路
三步:
-
拷贝单链表。在原链表每个结点后面插入一个与当前节点值相同的结点,例如:1-2-3-4-5拷贝后变成
1-1*-2-2*-3-3*-4-4*-5-5*
-
拷贝随机结点。给链表中新生成的结点关联上随机结点(如果原结点有的话)
-
拆分链表。把拷贝后的长链表拆分成两个链表(一新一旧)
解答
class Solution {
public Node copyRandomList(Node head) {
if(head==null) return null;
Node cur = head;
while (cur != null) {
Node tmp = new Node(cur.val);
tmp.next = cur.next;
cur.next = tmp;
cur = tmp.next;
}
cur = head;
while (cur != null) {
if (cur.random != null) {
cur.next.random = cur.random.next;
}
cur = cur.next.next;
}
cur = head.next;
Node pre = head, res = head.next;
while (cur.next != null) {
pre.next = pre.next.next;
cur.next = cur.next.next;
pre = pre.next;
cur = cur.next;
}
pre.next = null;
return res;
}
}
有点疑惑,最后一步处理中,为什么用下面这步不正确呢?
//截取复制好的新结点
cur = head.next;
Node res=cur;
//Node res = head.next, pre = head;
while (cur.next != null ) {
// pre.next = pre.next.next;
cur.next = cur.next.next;
// pre = pre.next;
cur = cur.next;
}
//pre.next = null;
return res;
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15104983.html