V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
binxin
V2EX  ›  问与答

Python 链表的歧义问题求助

  •  
  •   binxin · 2020-11-18 13:55:47 +08:00 · 995 次点击
    这是一个创建于 1252 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如下面这个定义 class ListNode: def init(self, val=0, next=None): self.val = val self.next = next

    遇到一个特别头疼的问题是,p.next 在代码中可能有歧义(或者是我理解不到位):

    1. 它可能是指 p 这个 ListNode 的 self.next,偶尔我想修改它
    2. 它可能是指 p 这个 ListNode 的下一个节点(具体内容)

    结果我连一个交换链表节点都做不好.......

    14 条回复    2020-11-18 18:59:13 +08:00
    Jirajine
        1
    Jirajine  
       2020-11-18 13:58:50 +08:00 via Android
    有类型在,没有歧义。
    p 是 ListNode[T],p.val 是 T 。
    p.next 是 ListNode[T],p.next.val 是 T 。
    Trim21
        2
    Trim21  
       2020-11-18 13:58:59 +08:00 via Android
    不应该是具体内容啊,如果是具体内容,你怎么访问下一个节点的下一个节点呢。
    想修改下一个节点的内容应该修改 p.next.val
    Hstar
        3
    Hstar  
       2020-11-18 14:04:35 +08:00
    什么玩意?建议重修
    renmu123
        4
    renmu123  
       2020-11-18 14:07:31 +08:00 via Android
    p.next=p.next.next
    binxin
        5
    binxin  
    OP
       2020-11-18 14:27:54 +08:00
    @renmu123
    嗯嗯,就比如这位老师的例子:p.next=p.next.next,
    等号右边是 p.next.next,那么它的前半部分,p.next 应该是指 p 这个节点的 next 指针,但是 p 这个节点的 next 指针是没有 next 属性的,得它指向的对象才有 next,也就是等号右边的 p.next.next 中的“p.next”,其实代表的是 p 的下一个节点整体内容,这个和左边的 p.next 不是一个含义。

    所以我是哪里理解错了呢?
    renmu123
        6
    renmu123  
       2020-11-18 14:41:51 +08:00
    @binxin #5 p1=Node(1), p2=Node(2), p3=Node(3) p1.next=p2 p2.next=p3 。 这时候链表就是:p1=>p2=>p3 。这时候 p1.next.next=p3 。如果 p1.next=p3,那么现在链表就是 p1=>p3 。p2 在链表中已经没有了。
    maocat
        7
    maocat  
       2020-11-18 14:50:38 +08:00
    p.next = p.next.next if p.next else None
    JeffGe
        8
    JeffGe  
       2020-11-18 14:59:08 +08:00 via Android
    Python 没有指针的概念,Python 所有变量都是对被右值的引用
    JeffGe
        9
    JeffGe  
       2020-11-18 14:59:39 +08:00 via Android
    @JeffGe 多打了个“被”
    binxin
        10
    binxin  
    OP
       2020-11-18 16:14:23 +08:00
    @maocat
    我说下我的理解:
    1. Python 没有指针的概念,Python 所有变量都是对被右值的引用意味着:p1.next=p2 中的 p1.next 其实是指 p2 这个 node,或者说 p1.next 是 p2 的引用?
    2. 那么在 p1.next = p3 的时候,其实不是把 p1 的 next 属性改成了 p3,而是把 p2 这个 node 改成了 p3,所以我哪里还是理解错了是么?
    iConnect
        11
    iConnect  
       2020-11-18 16:22:51 +08:00 via Android
    只是使用的话,建议去 github 上找现成的各种链表实现,久经考验的轮子比自己写靠谱的多。如果不能满足需求,自己写或者研究用途另说
    binxin
        12
    binxin  
    OP
       2020-11-18 16:28:19 +08:00
    @iConnect
    LC 第 24 、25 题卡壳中。。。。
    geebos
        14
    geebos  
       2020-11-18 18:59:13 +08:00 via Android
    理解成引用就好了,不要把 next 理解成对象,事实上 next 确实是引用而不是指针
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3658 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:27 · PVG 12:27 · LAX 21:27 · JFK 00:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.