Python 方法未就地修改
Python method not modifying in place
我正在尝试在 Python 中从头开始实现链表 class,我遇到了一个问题,该问题可能与 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
class 方法无法正常工作:
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()
所以我的问题是:我的实现有问题吗?还是我正在尝试做的事情完全不可能?
非常感谢!
您的第一种方法存在逻辑错误。您的节点 class 不能有反向方法。因为反转节点实际上没有任何意义。事实上,反转 link 列表确实有意义。
所以最好把你的代码分成两部分:
- 你的节点class有一个构造函数来初始化一个节点
- 一个 linked 列表 class 具有将节点附加到末尾和反转 linked 列表的功能。还将 linked 列表的头部传递给这两个函数
我正在尝试在 Python 中从头开始实现链表 class,我遇到了一个问题,该问题可能与 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
class 方法无法正常工作:
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()
所以我的问题是:我的实现有问题吗?还是我正在尝试做的事情完全不可能?
非常感谢!
您的第一种方法存在逻辑错误。您的节点 class 不能有反向方法。因为反转节点实际上没有任何意义。事实上,反转 link 列表确实有意义。
所以最好把你的代码分成两部分:
- 你的节点class有一个构造函数来初始化一个节点
- 一个 linked 列表 class 具有将节点附加到末尾和反转 linked 列表的功能。还将 linked 列表的头部传递给这两个函数