排序双链表

时间:2015-06-21 09:54:49

标签: python doubly-linked-list sortedlist

我想用添加和删除功能创建一个类排序,这是我的代码:

class SortedList(object):
    def __init__(self):
        self.head=None 
        self.tail=None

    def add (self, add_obj):
        newNode=DLLNode(add_obj)
        current=self.head
        if current==None:
            self.head=self.tail=newNode
        else:
            while add_obj>current.data:
                current=current.next_node
            newNode.next_node=current
            newNode.prev_node=current.prev_node
            current.prev_node.next_node=newNode
            current.prev_node=newNode

    def remove (self, element):
        current=self.head
        while element != current.data:
            current=current.next_node
        current.next_node.prev_node=current.prev_node
        current.prev_node.next_node=current.next_node
        current=None

我试图运行但它失败了。谁能让我知道为什么?

2 个答案:

答案 0 :(得分:0)

查看add函数的逻辑,我可以看到一些问题 -

  1. 添加了一个元素后,即self.headself.tail不再是None - ,您正在执行一个while循环来查找{ {1}}大于add_obj。但是while循环被错误地写了。让我们假设,我们只在链接列表中放入了1个元素,并且我们正在尝试添加大于current.data的数据,current将变为current,这是当前{{ 1}},然后您再次尝试进行相同的检查,这次您尝试访问current.next_node对象的None属性,从而产生data。您的删除代码也存在类似问题。

  2. 其次,在你的添加功能中,你只需要处理大于头,如果你以后添加一个小于所有其他元素的对象,你必须将它添加到self.head,但是这个案子没有处理。

  3. 你没有处理一个大于目前列表中所有其他元素的元素,在这种情况下,我认为你打算让self.tail成为最高值的元素,但是你没有做那个。

答案 1 :(得分:0)

def add (self, add_obj):
        newNode=DLLNode(add_obj)
        current=self.head
        if current==None:
            self.head=self.tail=newNode
        else:
            if add_obj<current.data:
                self.head.prev_node=newNode
                newNode.next_node=self.head
                self.head=newNode
                self.head.prev_node=None
            else:
                while add_obj>current.data:
                    current=current.next_node
                if current != None:
                    newNode.next_node=current
                    newNode.prev_node=current.prev_node
                    current.prev_node.next_node=newNode
                    current.prev_node=newNode
                else:
                    self.tail.next_node=newNode
                    newNode.prev_node=self.tail
                    self.tail=newNode
                    self.tail.next_node=None