推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
billyzs
V2EX  ›  Python

问各位一道 leetcode 上的题目

  •  
  •   billyzs · Nov 3, 2015 · 5015 views
    This topic created in 4020 days ago, the information mentioned may be changed or developed.

    https://leetcode.com/problems/remove-linked-list-elements/

    Remove all elements from a linked list of integers that have value val.

    Example
    Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
    Return: 1 --> 2 --> 3 --> 4 --> 5

    一开始用 recursion 写了个解法,碰到长一点的 input 就超时了。去看了一眼大家的 solution ,虽然每行干的啥能看懂,可和在一起就百思不得其解,好比这个:

    def removeElements(self, head, val):
        dummy = cur = ListNode(0)
        dummy.next = head
        while cur and cur.next:
            if cur.next.val == val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return dummy.next
    

    明明是操作了cur, 为什么return dummy.next返回的是正确答案呢? p2ex 上高手多,我先谢过了

    22 replies  •  2015-11-04 09:58:22 +08:00
    eycfsjd
    eycfsjd
    Nov 3, 2015❤️1
    1
    dummy 用来处理 head.val == val 的情况
    wshcdr
    wshcdr
    Nov 3, 2015
    2
    关注
    SharkIng
    SharkIng
    Nov 3, 2015❤️1
    3
    link list 结构问题。
    如果你将 cur.next = cur.next.next 了,也就是相当于跳过了 val 这个值
    当你 dummy.next = head 的时候,也就是相当于指向了整个 List.

    不知道这样解释是不是有点糊里糊涂... 楼下接上吧
    comesx4
    comesx4
    Nov 3, 2015❤️1
    4
    dummy.next 就是指向的就是 head.相当于在 head 前面加了一个 Node.
    bytenoob
    bytenoob
    Nov 3, 2015❤️1
    5
    python 连续赋值的问题
    >>>a = b = 9
    >>>a is b
    True

    so dummy is cur
    HSBC
    HSBC
    Nov 3, 2015
    6
    dummy.next 指向 head 阿,它就是要你返回操作后的链表阿。。。话说, LC 开始收费了, premium 1一年上百刀,真尼玛贵阿!
    gssdromen
    gssdromen
    Nov 3, 2015❤️1
    7
    等于用一个指针指向 head,方便操作
    billyzs
    billyzs
    OP
    Nov 3, 2015
    8
    @jonnyhsy 不太理解这个价格。正儿八经有收入的人哪会有大把时间刷 LC
    domty
    domty
    Nov 3, 2015
    9
    @jonnyhsy
    前两天没事想去刷 leetcode 发现收费了
    然后就去刷 lintcode 了
    刷的第一题就是你题的这个....
    EPr2hh6LADQWqRVH
    EPr2hh6LADQWqRVH
    Nov 3, 2015
    10
    wtf, 这种鬼网站还真有人上啊,现在的学生还真是闲啊
    billyzs
    billyzs
    OP
    Nov 3, 2015
    11
    @SharkIng 明白一些了。可是照这么 loop 下去 cur 不就变成 None 了吗
    mengzhuo
    mengzhuo
    Nov 3, 2015
    12
    因为 dummy.next = head 啊
    p.s. 别听楼上那些说刷题浪费时间的。
    billyzs
    billyzs
    OP
    Nov 3, 2015
    13
    @Yc1992 长知识。那么这么做有什么好处吗?只用一个 cur = LN 然后操作 cur 行不行呢
    domty
    domty
    Nov 3, 2015
    14
    @billyzs
    少年 你需要先搞清楚啥叫 引用...
    bytenoob
    bytenoob
    Nov 3, 2015❤️1
    15
    @billyzs 那样的话 dummy 和 cur 就是两个不同的链表了,显然不行。

    dummy 是链表头部, cur 负责循环 dummy 链表的每个节点, cur 最后会遍历到尾节点,不能用作返回值,我们需要返回链表的头部,即 dummy ,我是这样理解的。
    phx13ye
    phx13ye
    Nov 3, 2015❤️1
    16
    dummy 后继是链表头啊,所以 remove 完后,返回 dummy 后继节点
    SharkIng
    SharkIng
    Nov 3, 2015 via Android❤️1
    17
    @billyzs 不是有 while cur.next 么, 相当于 Java 里面的 while cur.next != null
    Andiry
    Andiry
    Nov 3, 2015
    18
    这都看不懂,建议你在纸上自己画个图,好加深理解
    billryan
    billryan
    Nov 3, 2015❤️1
    19
    1. 链表头节点不定的常用技巧,使用 dummy 节点。
    2. 删除链表中的节点,相当于将 next 指向新节点

    见 http://algorithm.yuanbin.me/zh-cn/linked_list/remove_linked_list_elements.html

    链表的常用方法见 http://algorithm.yuanbin.me/zh-cn/basics_data_structure/linked_list.html
    xuyinan503
    xuyinan503
    Nov 3, 2015
    20
    cur 就是 current 的缩写,都挪到最后头了,肯定不能返回 cur 啊
    kmahyyg
    kmahyyg
    Nov 4, 2015
    21
    @domty lintcode 咋样?有手机客户端吗?
    chy373180
    chy373180
    Nov 4, 2015❤️1
    22
    建议看下 python 中的拷贝
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3240 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 10:26 · PVG 18:26 · LAX 02:26 · JFK 05:26
    ♥ Do have faith in what you're doing.