剑指offer第35:复杂链表的复制

本文介绍两种复杂链表复制的方法:递归法和哈希表法。递归法通过递归复制每个节点及其random指针实现;哈希表法则利用哈希表存储原始节点与复制节点的关系,适用于大规模数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

法1:递归法

# -*- coding:utf-8 -*-
class RandomListNode:
    def __init__(self, x):
        self.label = x
        self.next = None
        self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        if not pHead:
            return
        newnode=RandomListNode(pHead.label)
        newnode.random=pHead.random
        newnode.next=self.clone(pHead.next)
        return newnode

时间复杂度O(n^2),每一个节点的random指针需要从头遍历。

黄色部分为什么这么写不理解。

法二:哈希表

# -*- coding:utf-8 -*-
class RandomListNode:
    def __init__(self, x):
        self.label = x
        self.next = None
        self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        nodelist = []
        randomlist = []
        labellist = []
        while pHead:
            nodelist.append(pHead)
            randomlist.append(pHead.random)
            labellist.append(pHead.label)
            pHead = pHead.next
        labelIndexlist = map(lambda c: nodelist.index(c) if c else -1, randomlist)
        copy = RandomListNode(0)
        pre = copy

        nodelist = map(lambda c: RandomListNode(c), labellist)
        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 copy.next

黄色部分疑问同法1,绿色部分也有疑问?

ps:1:map()函数

    map(function, iterable, ...)

    第二个参数序列的每一个元素调用第一个参数(函数)。

    2:lambda 匿名函数

 冒号:前为输入参数,:后为函数体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值