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

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

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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:

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

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