首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有序双向链表

有序双向链表
EN

Stack Overflow用户
提问于 2013-01-14 22:23:57
回答 1查看 3.5K关注 0票数 3

好的,一个来自assignment的问题说,要创建一个有序的双向链接list...such,每个名称按字典顺序排列较小的对象都位于相同名称的Dictionary...also对象中的其他One...Like名称之前,可以按任何顺序排列...

要链接两个对象,我有setBefore()setAfter()方法...我已经这样做了,much...but仍然不知道我在哪里做wrong..may,你们的一些指导可以帮助我…

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

代码语言:javascript
复制
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类。

代码语言:javascript
复制
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

其中之前和之后是指向双向链表中的左对象和右对象的链接...此类中的对象将被插入到双向链表中...

示例:

代码语言:javascript
复制
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

现在假设

代码语言:javascript
复制
code                             output
insert(b,Frob('code'))        bar->code->code->foo->frob
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-14 23:43:13

问题出在这条线上(当你向另一个方向移动时,也是一个等价的问题):

代码语言:javascript
复制
newFrob.setBefore(atMe.getBefore)

atMe.getBefore后面缺少一组圆括号,因此最终要将绑定的方法本身传递给newFrob.setBefore,而不是传递该方法返回的值。这是一个很容易犯的打字错误,所以我不会因为在你的作业中错过它而感到太糟糕。

我通过尝试以下插入序列并检查值发现了这个错误(我已经总结了使用注释可以正常工作的值):

代码语言:javascript
复制
>>> 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,它使我找到了代码中的错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14320257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档