JZ25:复杂链表的复制

题目描述:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解法:

设原链表如下图所示:

则复制该链表分为三步。
(1)复制next主线。


(2)建立哈希表。这题难点在于,值可以复制,但节点无法复制。虽然两个节点的值相同,但他们被分配在不同的存储空间。因此,使用哈希表,在每个新节点和原节点之间建立一一对应的映射。


(3)完成复制。

我的方法比较直观,但需要执行3遍循环。如有更好的方法请留言。

代码:

# -*- coding:utf-8 -*-
# class RandomListNode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, head):
        new = RandomListNode(0)
        new1 = new
        memo = dict()
        head1 = head
        while head1:
            new1.next = RandomListNode(head1.label)
            new1 = new1.next
            head1 = head1.next
        head2 = head
        new2 = new.next
        while new2:
            memo[new2] = head2
            head2 = head2.next
            new2 = new2.next
        new3 = new.next
        head3 = head
        while head3:
            for key in memo.keys():
                if memo[key] == head3.random:
                    new3.random = key
            new3 = new3.next
            head3 = head3.next
        return new.next

你可能感兴趣的:(JZ25:复杂链表的复制)