剑指offer——复杂链表的复制

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

解答如下:
环境:python 2.7.3

本题的思路是:
1.用pTmp指针遍历原链表的每一个节点,复制原链表的每个节点并作为对应原节点的下一个节点,显示在下图就是复制红色节点为黄色节点,放在原节点的后边。
2.第二步要做的是修改每一个新节点(黄色节点)的random指针的指向,这里可以观察到如下关系:(注意如果一个节点random指针指向空,则跳过这个节点)

pTmp.next.random = pTmp.random.next

那么通过移动原链表的临时指针pTmp,就可以修改每个黄色节点的random指针指向。
3.第三步就是分离两个链表,用newHead指向新链表的表头,这里再为新链表建立临时指针pNewTemp,通过移动两个临时指针来断开新旧节点连接,然后建立新连接。最后返回新链表的表头指针newHead。
在这里插入图片描述

class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        #复制一个一样的node,添加到之前链表的每个节点后面。
        if pHead == None:
            return None
        pTmp = pHead
        while pTmp:
            node = RandomListNode(pTmp.label)
            node.next = pTmp.next
            pTmp.next = node
            pTmp = node.next
            
        #实现新节点node的random指向
        pTmp = pHead
        while pTmp:
            if pTmp.random:
                pTmp.next.random = pTmp.random.next
            pTmp = pTmp.next.next
            
        #断开原来的每个节点和新node之间的连接
        pTmp = pHead
        newHead = pHead.next
        pNewTmp = pHead.next
        while pTmp:
            pTmp.next = pTmp.next.next
            if pNewTmp.next:
                pNewTmp.next = pNewTmp.next.next
                pNewTmp = pNewTmp.next
            pTmp = pTmp.next
        return newHead
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值