zoukankan      html  css  js  c++  java
  • 复杂链表的复制 -python编写

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

    题目分析
    1.如果链表为空链表,则返回本身即可
    2.如果非空 需要进行复制操作,如果没有特殊指针,只需要复制next我相信大家都能很快做出来,但是加上特殊指针这就需要一定技巧,因为特殊指针随便指,而你每次找特殊指针所指的节点都需要从头开始遍历找起,这显然复杂度高达O(n²)
    下面介绍一个巧妙地思想方法:
    如图
    首先第一步 复制原来的链表,顺次连接形成新链表
    这里写图片描述

    cloNode = pHead
    while cloNode:
        #完成第一步的核心操作
        node = RandomListNode(cloNode.label)
        node.next = cloNode.next
        cloNode.next = node
    
        cloNode = node.next #下一次操作
    

    第二步,利用原节点的random指向,来用复制的相应节点的random
    这里写图片描述

    cloNode = pHead
    while cloNode:
        node = cloNode.next #指向复制的结点
        if cloNode.random: #如果原节点有特殊指针
            node.random = cloNode.random.next #则复制的节点的特殊指针指向原节点的特殊指针指向的下一个值  看图更好理解一些
        cloNode = node.next
    

     最后一步,将复制好的链表拆分出来,或者说将 偶数位的节点重新拆分合成新的链表,得到的就是复制的链表
    这里写图片描述

    cloNode = pHead
    pHead = pHead.next
    while cloNode.next:
        #完成第三步的核心操作 此时节点指向隔了一个节点的节点
        node = cloNode.next
        cloNode.next = node.next
    
        cloNode = node #下一个节点的操作
    

    这个操作其实就是将两个链表顺次全都拆分出来,一个很关键的步骤 pHead = pHead.next 如果没有这句话,最后得到的pHead就是原链表的开头了。

    总程序如下:

    # -*- 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 pHead
            cloNode = pHead
            while cloNode:
                node = RandomListNode(cloNode.label)
                node.next = cloNode.next
                cloNode.next = node
                cloNode = node.next
            cloNode = pHead
            while cloNode:
                node = cloNode.next
                if cloNode.random:
                    node.random = cloNode.random.next
                cloNode = node.next
            cloNode = pHead
            pHead = pHead.next
            while cloNode.next:
                node = cloNode.next
                cloNode.next = node.next
                cloNode = node
            return pHead
    
  • 相关阅读:
    Android ArrayAdapter使用
    Android 更改字体
    C# CRC16校验码 1.0
    获取当前主题颜色 Flutter
    C# 每个字节接受 处理串口数据 的方法
    C# CRC
    char* 与 string 互转
    typeof 子类获取父类
    flutter Row 垂直或水平放置多个widget
    flutter 容器 几种写法
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/9769529.html
Copyright © 2011-2022 走看看