繁体   English   中英

从链接列表中删除具有“前哨”的节点

[英]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.nilnextprev值将始终具有有效节点。

您将需要更改removeNodeprintList循环以检查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

将解决您的问题。 你可能希望把在这个逻辑setPrevsetNext功能(以确保a == a.next.preva == a.prev.next在任何时候为所有a除两端)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM