【问题标题】:Reversing a singly linked list in python... I think I'm misunderstanding how python deals with references在python中反转单链表......我想我误解了python如何处理引用
【发布时间】:2013-11-29 19:49:53
【问题描述】:

我只是在尝试我认为是一个相当简单的问题,但在编写它时我似乎遇到了一些困难。下面是代码......函数'my_reverse'是我编写它的方式,我似乎无法弄清楚它为什么不起作用(尽管我确信错误很简单)。函数'reverse'是我在网上找到的一些代码,它确实有效。看来我们的方法很相似。此外,在 while 循环中,当您设置 nxt = current.nxt,然后设置 current.nxt = last 时,这不是使 nxt.nxt = last 吗?

class Node:
    def __init__(self, val, nxt):
        self.val = val
        self.nxt = nxt

def my_reverse(n):
    if (n.nxt is None):
        return n
    prev = n
    curr = n.nxt
    while (curr is not None):
        nxt = curr.nxt
        curr.nxt = prev
        prev = curr
        curr = nxt
    return prev


def reverse(n):
    last = None
    current = n
    while (current is not None):
        nxt = current.nxt
        current.nxt = last
        last = current
        current = nxt
    return last

def traverse(n):
    iter = n
    while iter != None:
        print iter.val
        iter = iter.nxt

n0 = Node(4, None)
n1 = Node(3, n0)
n2 = Node(2, n1)
n3 = Node(1, n2)

traverse(n3)

l = my_reverse(n3)
traverse(l)

【问题讨论】:

  • 当你设置nxt = current.nxt,然后设置current.nxt = last,这不是nxt.nxt = last吗?。不,因为你 重新绑定 current.nxtnxt 不遵循重新绑定。
  • 我明白了。那么列表有例外吗?因为我知道如果你设置 a = [1, 2],然后设置 b = a,然后执行 b.append(3),a 现在将是 [1, 2, 3]。还有其他例外吗?
  • 这完全不同。然后,您将复制对同一对象的引用并更改对象本身。但是,如果您随后执行b = c,那么a 也不会突然指向c
  • 好吧,我想我明白了。谢谢。

标签: python reference linked-list


【解决方案1】:

我认为你的方法很好,只是你忘记终止链表。

变化:

prev = n
curr = n.nxt

prev = n
curr = n.nxt
n.nxt = None

它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多