订购双重链接列表

时间:2013-01-14 14:23:57

标签: python doubly-linked-list

Ok分配中的一个问题是创建一个有序的双向链表...这样每个具有字典缩小名称的对象都会出现在“之前”另一个......类似于词典中的名称......也是同名的对象可以按任何顺序排列......

要链接两个对象,我有setBefore()setAfter()方法... 而且我做了这么多......但仍然不知道我在哪里做错了。可能是你们的一点指导可以帮助我......

atMe是已存在于双向链表中的对象,newFrob是要插入的对象...

def insert(atMe, newFrob):
    if newFrob.myName() < atMe.myName():
        if atMe.getBefore() == None:
            atMe.setBefore(newFrob)
            newFrob.setAfter(atMe)
        elif atMe.getBefore().myName()<newFrob.myName():
            atMe.getBefore().setAfter(newFrob)
            newFrob.setBefore(atMe.getBefore)
            atMe.setBefore(newFrob)
            newFrob.setAfter(atMe)
        else:
            insert(atMe.getBefore(),newFrob)

    elif newFrob.myName() > atMe.myName():
        if atMe.getAfter() == None:
            atMe.setAfter(newFrob)
            newFrob.setBefore(atMe)
        elif atMe.getAfter().myName()>newFrob.myName():
            atMe.getAfter().setBefore(newFrob)
            newFrob.setAfter(atMe.getAfter)
            atMe.setAfter(newFrob)
            newFrob.setBefore(atMe)
        else:
            insert(atMe.getAfter(),newFrob)

    elif newFrob.myName()==atMe.myName():
        if atMe.getAfter() != None:
            newFrob.setAfter(atMe.getAfter())
        newFrob.setBefore(atMe)
        if atMe.getAfter() != None:
            atMe.getAfter().setBefore(newFrob)
        atMe.setAfter(newFrob)

这是要使用的Frob类......

class Frob(object):
    def __init__(self, name):
        self.name = name
        self.before = None
        self.after = None
    def setBefore(self, before):
        self.before = before
    def setAfter(self, after):
        self.after = after
    def getBefore(self):
        return self.before
    def getAfter(self):
        return self.after
    def myName(self):
        return self.name

其中Before和After是双链表中左右对象的链接... 此类中的对象将插入双链表...

示例:

a=Frob('foo')
b=Frob('bar')
c=Frob('frob')
d=Frob('code')

code                             output
insert(a,b)                   bar->foo
insert(a,c)                   bar->foo->frob
insert(b,d)                   bar->code->foo->frob

现在假设

code                             output
insert(b,Frob('code'))        bar->code->code->foo->frob

1 个答案:

答案 0 :(得分:3)

问题在于这一行(当你向另一个方向移动时,也是一个等效的问题):

newFrob.setBefore(atMe.getBefore)

您在atMe.getBefore之后缺少一组括号,因此您最终将绑定方法本身传递给newFrob.setBefore,而不是该方法返回的值。这是一个简单的拼写错误,所以在你的任务中错过它我不会感觉太糟糕。

我通过尝试以下插入序列并检查值来找到错误(我总结了那些与评论一起正常工作的那些):

>>> a = Frob("a")
>>> b = Frob("b")
>>> c = Frob("c")
>>> d = Frob("d")
>>> insert(a, b) # list is a<->b
>>> insert(a, d) # list is a<->b<->d
>>> insert(a, c) # list is a<->b<->c->?
>>> c.getAfter()
<bound method Frob.getAfter of <__main__.Frob object at 0x000000000318EBA8>>

最后提到的对象是b,这导致我在代码中找到错误。