【剑指offer】--------复杂链表的复制

本文详细解析了复杂链表的复制方法,包括如何通过映射关系进行链表复制,以及为何要先复制主干再复制random指针。提供了一种自定义解法,并预留了另一种常见解法供后续更新。

这题稍稍费了点劲,注意理解对题意,并在最开始就要考虑特殊情况
最该注意的地方是:复制链表,意思是新建一个链表类,再把各个元素连接起来,而不是简单的指向原链表的元素(听着很蠢,但很容易犯这种错)

题目描述

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

解法1:根据映射关系复制链表

这是我自己的想法,稍微有些复杂
先复制链表主干,并生成新链表与原链表的映射关系,在根据原链表的random指针与映射关系,将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
        if not pHead:
            return None
        # 这两个list是用来生成映射关系的
        # 映射的方法是两个list相同index的元素,就是相互对应的链表元素
        map_list_ori = []
        map_list_new = []
        new_head = RandomListNode(pHead.label)
        map_list_ori.append(pHead)
        map_list_new.append(new_head)
        if not pHead.next:
            return new_head
        pointer = pHead.next
        next_node = RandomListNode(pointer.label)
        new_head.next = next_node
        map_list_ori.append(pointer)
        map_list_new.append(next_node)
        pointer = pointer.next
        # 这里是先复制主干
        while pointer:
            next_node_pointer = RandomListNode(pointer.label)
            next_node.next = next_node_pointer
            next_node = next_node_pointer
            map_list_ori.append(pointer)
            map_list_new.append(next_node)
            pointer = pointer.next
        if pHead.random:
            index = map_list_ori.index(pHead.random)
            new_head.random = map_list_new[index]
        pointer = pHead.next
        # 这里复制random指针
        # 应该不难理解为什么先复制主干,再复制random指针
        while pointer:
            if pointer.random:
                pointer_index = map_list_ori.index(pointer)
                random_index = map_list_ori.index(pointer.random)
                map_list_new[pointer_index].random = map_list_ori[random_index]
            pointer = pointer.next

        return new_head

  

解法2:

还有一种使用更普遍的解法,日后更新

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值