这题稍稍费了点劲,注意理解对题意,并在最开始就要考虑特殊情况
最该注意的地方是:复制链表,意思是新建一个链表类,再把各个元素连接起来,而不是简单的指向原链表的元素(听着很蠢,但很容易犯这种错)
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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:
还有一种使用更普遍的解法,日后更新
本文详细解析了复杂链表的复制方法,包括如何通过映射关系进行链表复制,以及为何要先复制主干再复制random指针。提供了一种自定义解法,并预留了另一种常见解法供后续更新。
256

被折叠的 条评论
为什么被折叠?



