zoukankan      html  css  js  c++  java
  • 138. Copy List with Random Pointer

    https://leetcode.com/problems/copy-list-with-random-pointer/#/description

    A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

    Return a deep copy of the list.

    Sol 1:

    # Definition for singly-linked list with a random pointer.
    # class RandomListNode(object):
    #     def __init__(self, x):
    #         self.label = x
    #         self.next = None
    #         self.random = None
    
    class Solution(object):
        def copyRandomList(self, head):
            """
            :type head: RandomListNode
            :rtype: RandomListNode
            """
            # Time O(2n) Space O(1) 
    
            dic = dict()
            m = n = head
            
            # m is to copy label data structure, one pass. Time O(n) 
            while m:
                dic[m] = RandomListNode(m.label)
                m = m.next
            # n is to copy next and random data structure. one pass. Time O(n)
            while n:
                dic[n].next = dic.get(n.next)
                dic[n].random = dic.get(n.random)
                n = n.next
            return dic.get(head)

    Note:

    1 In the initlization of a linked list, 

    self.label = x

    "label" here mean value.... it's a name, does not matter

    Sol 2:

    # Definition for singly-linked list with a random pointer.
    # class RandomListNode(object):
    #     def __init__(self, x):
    #         self.label = x
    #         self.next = None
    #         self.random = None
    
    import collections
    class Solution(object):
        def copyRandomList(self, head):
            """
            :type head: RandomListNode
            :rtype: RandomListNode
            """
            # Time O(n) Space O(1) 
    
            # Nice lambda initlization here. Pythonic
            dic = collections.defaultdict(lambda : RandomListNode(0))
            dic[None] = None
            
            n = head
    
            while n:
                dic[n].label = n.label
                dic[n].next = dic[n.next]
                dic[n].random = dic[n.random]
                n = n.next
            return dic.get(head)
  • 相关阅读:
    2018年全国多校算法寒假训练营练习比赛(第二场)F
    牛客练习赛2 A
    牛客练习赛1 C
    牛客练习赛1 B
    vb编程代码大全
    javascript编程代码笔记
    391.FANUC宏程序编程
    宏程序编程实例,简单易懂
    Java类与类之间的关系详细介绍
    C++虚继承时的构造函数的讲解
  • 原文地址:https://www.cnblogs.com/prmlab/p/7230192.html
Copyright © 2011-2022 走看看