【剑指Offer】 25.复杂链表的复制 python实现

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路

解释哈希表法的过程
【剑指Offer】 25.复杂链表的复制 python实现_第1张图片
nodeList = [1,2,3,4] #存放各个节点
randomList = [3,4,2,1] #存放各个节点指向的random节点。
labelList = [1,2,3,4] #存放各个节点的值

labelIndexList = map(lambda c: nodeList.index(c) if c else -1, randomList)

labelIndexList = [2,3,1,0]

nodeList=map(lambda c:RandomListNode(c),labelList)

nodeList=[1,2,3,4]

#把每个节点的random绑定好,根据对应的index来绑定
        for i in range(len(nodeList)):
            if labelIndexList[i]!=-1:
                nodeList[i].random=nodeList[labelIndexList[i]]

第一次循环:

nodeList[0].random=nodeList[labelIndexList[0]]==nodeList[2]

python两种解法


递归法


# -*- coding:utf-8 -*-
# class RandomListNode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None

class Solution:
    def Clone(self, head):
        if not head: return
        newNode = RandomListNode(head.label)
        newNode.random = head.random
        newNode.next = self.Clone(head.next)
        return newNode

s = Solution()
res = s.Clone([5,7,7,8])
print('.....',res)

哈希表法


# -*- coding:utf-8 -*-
# class RandomListNode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None

class Solution:
    def Clone(self, head):
        nodeList = []     #存放各个节点
        randomList = []   #存放各个节点指向的random节点。没有则为None
        labelList = []    #存放各个节点的值
 
        while head:
            randomList.append(head.random)
            nodeList.append(head)
            labelList.append(head.label)
            head = head.next
        #random节点的索引,如果没有则为1   
        labelIndexList = map(lambda c: nodeList.index(c) if c else -1, randomList)
 
        dummy = RandomListNode(0)
        pre = dummy
        #节点列表,只要把这些节点的random设置好,顺序串起来就ok了。
        nodeList=map(lambda c:RandomListNode(c),labelList)
        #把每个节点的random绑定好,根据对应的index来绑定
        for i in range(len(nodeList)):
            if labelIndexList[i]!=-1:
                nodeList[i].random=nodeList[labelIndexList[i]]
        for i in nodeList:
            pre.next=i
            pre=pre.next
        return dummy.next

s = Solution()
res = s.Clone([5,7,7,8])
print('.....',res)

你可能感兴趣的:(数据结构与算法)