2015-06-21 130 views
-2

我想创建一个类排序本身的添加和移除功能,这里是我的代码:排序的双向链表

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 

我试图逃跑,但失败了。任何人都可以让我知道为什么?

+0

什么是失败?任何错误?你得到了什么?你应该尝试把这些问题放在问题中,然后按'Post'按钮,让阅读问题的人更容易帮助你 –

回答

0

看着你add功能的逻辑,我可以看到一些问题 -

  1. 一旦你添加了一个元素,那就是一旦你self.headself.tail不再 - None - ,你正在做的一个while循环来查找add_obj是否大于current.data。但是while循环写错了。让我们假设,我们只在链表中添加了1个元素,并且我们试图添加一个大于current,current的数据,将会变成current.next_node,这是当前的None,那么你再次尝试做同样的检查,这次你尝试访问dataNone对象的财产,导致Error。您的移除代码存在类似的问题。

  2. 其次,在你的添加函数中,你只关心大于头部,如果稍后添加一个小于所有其他元素的对象,你必须将它添加到self.head中,但是该案件没有处理。

  3. 你没有处理添加一个比当前列表中的所有其他元素都大的元素,在这种情况下,我认为你打算让self.tail元素的值最高,但是你没有这样做无论是。

+0

感谢您的帮助。现在我改变我的代码为这样的添加功能,它是否照顾这些问题? –

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