和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ25 复杂链表的复制

原题链接


描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。


示例

输入:{1,2,3,4,5,3,5,#,2,#}
返回值:{1,2,3,4,5,3,5,#,2,#}

思路

三步:

  1. 拷贝单链表。在原链表每个结点后面插入一个与当前节点值相同的结点,例如:1-2-3-4-5拷贝后变成

    1-1*-2-2*-3-3*-4-4*-5-5*

  2. 拷贝随机结点。给链表中新生成的结点关联上随机结点(如果原结点有的话)

  3. 拆分链表。把拷贝后的长链表拆分成两个链表(一新一旧)


解答

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;
posted @ 2021-07-20 09:56  klaus08  阅读(27)  评论(0编辑  收藏  举报