[英]Deleting a node from Linked List having “sentinels”
我试图根据CLRS的书写一个带有哨兵的链表。 我的remove函数出于某种原因将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
@tcaswell已正确诊断了代码问题:您没有在self.nil.next
正确设置为self.nil.next
的节点上设置prev
链接。 但是,我认为他的解决方案并不理想。 这是我的建议:
这是该问题的即时解决方案:
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
。 但是,我们可以通过在List
构造函数中创建self.nil
链接到自身来修复它:
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
。
该缺陷是在你的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
除两端)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.