【发布时间】: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