分析让复杂问题简单---复杂链表的复制

题目描述:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
在这里插入图片描述
思路:
1,如果链表为空链表,则返回本身即可。
2,如果链表非空的情况:如果没有特殊指针,则只需要复制。如果含有特殊指针,需要技巧。

思路1:
首先复制原来的链表,顺次连接形成新的链表。
在这里插入图片描述

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

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

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

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

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

总程序如下:

// An highlighted block
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
#######第二步,利用原节点的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
        return pHead

Python实现2:

// An highlighted block
def iter_node(root):
    while root:
        yield root
        root = root.next

class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        mem = dict()
        for i,n in enumerate(iter_node(pHead)):
            mem[id(n)] = i
        lst = [RandomListNode(n.label) for n in iter_node(pHead)]
        for t,f in zip(iter_node(pHead),lst):
            if t.next:
                f.next = lst[mem[id(t.next)]]
            if t.random:
                f.random = lst[mem[id(t.random)]]
        return lst[0] if lst else None   

https://blog.csdn.net/besmarterbestronger/article/details/96975588

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值