复杂链表的复制(python对象的值传递问题)

题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)(参考https://github.com/leeguandong/Interview-code-practice-python/blob/master/剑指offer/复杂链表的复制.py

代码:

'''
思路:1. 根据旧链表创建新链表,不去管随机的那个指针
     2. 根据旧链表中的随机指针,创建新链表中的随机指针
     3. 从旧链表中拆分得到新链表
32ms
5632k
'''

# -*- 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):
        if pHead == None:
            return None
        self.CloneNodes(pHead)
        self.ConnectRandomNodes(pHead)
        return self.ReconnectNodes(pHead)
    # 复制原始链表的每个结点, 将复制的结点链接在其原始结点的后面
    def CloneNodes(self, pHead):
        pNode = pHead
        while pNode:
            pCloned = RandomListNode(0)
            pCloned.label = pNode.label
            pCloned.next = pNode.next
            # pCloned.random = None         #不需要写这句话, 因为创建新的结点的时候,random自动指向None

            pNode.next = pCloned
            pNode = pCloned.next

    # 将复制后的链表中的复制结点的random指针链接到被复制结点random指针的后一个结点
    def ConnectRandomNodes(self, pHead):
        pNode = pHead
        while pNode:
            pCloned = pNode.next
            if pNode.random != None:
                pCloned.random = pNode.random.next
            pNode = pCloned.next

    # 拆分链表, 将原始链表的结点组成新的链表, 复制结点组成复制后的链表
    def ReconnectNodes(self, pHead):
        pNode = pHead
        pClonedHead = pClonedNode = pNode.next
        pNode.next = pClonedHead.next
        pNode = pNode.next

        while pNode:
            pClonedNode.next = pNode.next
            pClonedNode = pClonedNode.next
            pNode.next = pClonedNode.next
            pNode = pNode.next

        return pClonedHead

注解:

关于python对象的值传递问题的小实验

#定义类
class RandomListNode:
    def __init__(self, x):
        self.label = x
        self.next = None

#打印结点信息
def Print_link(pHead):
    # p = copy.deepcopy(pHead)
    p = pHead
    while p:
        print('-----------------')
        print('当前结点的值:',p.label)
        if p.next:
            print('下一个结点的值:',p.next.label)
        else:
            print('下一个结点为空')
        print('-----------------')
        p = p.next

if __name__ == '__main__':

    node1 = RandomListNode(1)
    node2 = RandomListNode(2)
    node3 = RandomListNode(3)
    node1.next = node2
    node2.next = node3
    node3.next = None

    Print_link(node1)

    #通过验证,发现python对象是通过址传递来进行赋值,可以通过node4 = copy.deepcopy(node1)来解决
    node4 = node1
    print('结点4的下一个结点的值',node4.next.label)
    node1.next = node3
    print('结点1的下一个结点的值',node1.next.label)
    print('改变结点1下一个结点的指向之后:')
    print('结点4的下一个结点的值',node4.next.label)

'''
输出如下

-----------------
当前结点的值: 1
下一个结点的值: 2
-----------------
-----------------
当前结点的值: 2
下一个结点的值: 3
-----------------
-----------------
当前结点的值: 3
下一个结点为空
-----------------
结点4的下一个结点的值 2
结点1的下一个结点的值 3
改变结点1下一个结点的指向之后:
结点4的下一个结点的值 3
'''

疑问:

上述结题代码中的第47行:pClonedHead = pClonedNode = pNode.next

改变pNode的值和后继指针以后,不是会影响pClonedHead的值和后继指针吗?

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值