我正在尝试根据CLRS书写一个包含哨兵的链接列表。我的删除功能由于某种原因将一大块LL删除到要删除的节点。附上是我的代码。任何建议都将深表感谢。
class Node():
def __init__(self,v):
self.value = v
self.next = None
self.prev = None
def getValue(self):
return self.value
def changeValue(self,v):
self.value = v
def getNext(self):
return self.next
def getPrev(self):
return self.prev
def setNext(self,newNext):
self.next = newNext
def setPrev(self,newPrev):
self.prev = newPrev
class List(Node):
def __init__(self):
self.nil = Node(None)
def addNode(self,v):
a = Node(v)
a.setNext(self.nil.next)
a.setPrev(self.nil)
self.nil.next = a
def length(self):
count = 0
a = self.nil
while(a.next != None):
count += 1
a = a.getNext()
return count
def search(self,v):
a = self.nil
while(a.next != None):
if (a.value == v):
return True
a = a.getNext()
return False
def remove(self,v):
a = self.nil.next
breakloop = 0
while((a.next != None) and (breakloop == 0)):
if (a.value == v):
a.prev.next = a.next
a.next.prev = a.prev
breakloop = 1
a = a.getNext()
def printList(self):
a = self.nil.next
while(a.next != None):
print(a.value)
a =a.getNext()
print(a.value)
a = List()
a.addNode(4)
a.addNode(7)
a.addNode(2)
a.addNode(6)
a.addNode(5)
a.addNode(8)
a.addNode(1)
a.addNode(14)
a.addNode(13)
a.addNode(17)
a.addNode(18)
a.printList()
a.remove(13)
a.printList()
输出将是
18 17 13 14 1 8 5 6 2 7 4
14 1 8 5 6 2 7 4
答案 0 :(得分:2)
@tcaswell已经正确诊断了代码中的问题:您没有在以前正确prev
的节点上设置self.nil.next
链接。但是,我认为他的解决方案并不理想。以下是我的建议:
以下是该问题的直接解决方法:
def addNode(self, v):
a = Node(v)
a.setNext(self.nil.next)
self.nil.next.setPrev(a) # this is the link that was previously missing
a.setPrev(self.nil)
self.nil.setNext(a)
但是,当列表为空时,这将无法正常工作,因为self.nil.next
在开始时为None
。我们可以通过在self.nil
构造函数中创建List
时将def __init__(self):
self.nil = Node(None)
self.nil.next = self.nil.prev = self.nil # set up circular links!
链接到自身来修复它:
self.nil
现在,next
将始终拥有一个有效节点,因为它是prev
和removeNode
值。
您需要更改printList
和self.nil
循环,以检查None
而不是{{1}}。
答案 1 :(得分:1)
错误发生在addNode
函数中,所有节点的.prev
节点为self.nil
使用以下内容:
def addNode(self,v):
a = Node(v)
a.setNext(self.nil.next)
if self.nil.next is not None:
self.nil.next.setPrev(a)
a.setPrev(self.nil)
self.nil.next = a
将解决您的问题。您可能希望将此逻辑放在setPrev
和setNext
函数中(以确保a == a.next.prev
和a == a.prev.next
始终对所有a
除了结尾之外的所有{{1}}