【问题标题】:Python method not modifying in placePython方法没有就地修改
【发布时间】:2021-05-10 20:05:16
【问题描述】:

我正在尝试在 Python 中从头开始实现一个链表类,并且遇到了一个可能与 Python 的工作方式有关的问题,但我想确定一下。

这是我的实现的基础:

class Node(object):
    def __init__(self, data=None, next=None):
        self.next = next
        self.data = data

    def appendToTail(self, d: int):
        newNode = Node(d)
        while self.next is not None: self = self.next
        self.next = newNode

而类方法不能像我希望的那样工作:

    def reverse(self):
        prevNode = None
        currentNode = self # current = 1
        while self is not None:
            nextNode = self.next
            self.next = prevNode
            prevNode = self
            self = nextNode
        self = prevNode

我正在尝试将链表反转到位,但是当我调用此方法时,列表似乎为空。 我还实现了这个方法的另一个版本,它在最后执行return self,返回的列表确实是我正在寻找的正确结果:

def reverseNotInPlace(n: Node()) -> Node():
    prevNode = None
    n = n.next
    while n is not None:
        nextNode = n.next
        n.next = prevNode
        prevNode = n
        n = nextNode
    return prevNode

总结一下:

# creating a linked list such as: [1 -> 2 -> 3]
myList = Node()
myList.appendToTail(1)
myList.appendToTail(2)
myList.appendToTail(3)

# inverting it not in place works
invList = reverseNotInPlace(myList)
# returns [3 -> 2 -> 1]

myList.reverse()
# returns only the first node of myList()

所以我的问题是:我的实现有问题吗?还是我试图做的事情不太可能?

非常感谢!

【问题讨论】:

  • edit 修复格式问题。另请注意,“类方法”通常意味着:classmethod 作用于 (cls) 而不是实例 (self)。
  • 分配给self 不会更改列表。一旦方法返回,self 仍然指向列表的原始头部。除非您使用虚拟节点(以便self.next,而不是self 本身,指的是第一项),否则您无法在不修改self.data 的情况下进行就地反转。
  • self = prevNode 只是将 local 名称 self 绑定到另一个值。它不会修改实例的任何 other 别名。
  • 使用 2 个类可能更容易:一个用于node,一个用于list。后者维护头(和可选的)尾指针。这样就不用修改self了。
  • „不确定您对格式的含义“ 由于缩进不正确,代码至少有两个语法错误。

标签: python class linked-list reference


【解决方案1】:

您的第一种方法存在逻辑错误。您的 Node 类不能有反向方法。由于反转节点实际上没有任何意义。事实上,反转链接列表确实有意义。

所以最好把你的代码分成两部分:

  1. 您的节点类具有用于初始化节点的构造函数
  2. 一个链表类,具有将节点附加到末尾和反转链表的功能。还将链表的头部传递给这两个函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2018-10-08
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多