2017-08-16 19 views
0

我用Python寫了一個程序爲雙向鏈表理解algorithm.However只有功能的某些部分是working.This後低於錯誤執行雙向鏈表的

class Node(object): 

    def __init__(self,d): 
     self.next_node = None 
     self.prev_node = None 
     self.data = d 

class DoublyLinkedList(object): 

    def __init__(self): 
     self.head = None 
     self.tail = None 
     self.size = 0 

    def add(self,d): 
     new_node = Node(d) 
     if self.tail: 
      self.tail.next_node = new_node 
      new_node.next_node = None 
      new_node.prev_node = self.tail 
     else: 
      self.head = new_node 
      self.tail = new_node 
      new_node.prev_node = None 
     self.size+=1 

    def addBeg(self,d): 
     new_node = Node(d) 
     current_node = self.head 
     current_node.prev_node = new_node 
     new_node.prev_node = None 
     new_node.next_node = current_node 
     self.head = new_node 
     self.size+=1 

    def add_at(self,d,index): 
     new_node = Node(d) 
     previous_node = None 
     current_node = self.head 
     i = 0 
     while i<index and current_node: 
      previous_node = current_node 
      current_node = current_node.next_node 
      i+=1 
     #once it reaches the desired index 
     if i==index: 
      previous_node.next_node = new_node 
      new_node.prev_node = previous_node 
      new_node.next_node = current_node 
      current_node.prev_node = new_node 
      self.size+=1 
      return True 
     else: 
      return False    #list ain't too long 


    def remove(self,d): 
     previous_node = None 
     current_node = self.head 
     while current_node: 
      if current_node.data == d: 
       if previous_node: #the node is somewhere in between 
        previous_node.next_node = current_node.next_node 
        current_node.next_node.prev_node = previous_node 
       else: 
        #it is the first node 
        self.head = current_node.next_node 
        current_node.next_node.prev_node = None 
       self.size -= 1 
       return True 

      previous_node = current_node 
      current_node = current_node.next_node 
     return False 

    def search(self,d): 
     current_node = self.head 
     while current_node: 
      if current_node.data == d: 
       return True 
      current_node = current_node.next_node 
     return False 

    #traverse through the linked list and store the elements in a list 
    def to_list(self): 
     lis = [] 
     current_node = self.head 
     while current_node: 
      lis.append(current_node.data) 
      current_node = current_node.next_node 
     return lis 

dll = DoublyLinkedList() 

當我嘗試我的代碼插入使用附加功能的多個元素,它的行爲strange.For例如,如果我嘗試添加三個要素,它只顯示第一個和最後

ll.add(40) 
ll.add(50) 
ll.add(60) 
print(ll.to_list()) 

我得到的輸出爲[40,60]

第二個問題是,如果我刪除寄託都else和保持一個元素

#removed all other elements 
ll.add(70) 

我得到「沒有屬性」 error.What是怎麼回事?

回答

0

添加功能中的問題,忘記更新self.tail

def add(self,d): 
    new_node = Node(d) 
    if self.tail: 
     self.tail.next_node = new_node 
     new_node.next_node = None 
     new_node.prev_node = self.tail 
     self.tail=new_node #change is here 
    else: 
     self.head = new_node 
     self.tail = new_node 
     new_node.prev_node = None 
    self.size+=1 

刪除最後一個節點的另一個問題。

def remove(self,d): 
    previous_node = None 
    current_node = self.head 
    while current_node: 
     if current_node.data == d: 
      if previous_node: #the node is somewhere in between 
       #print(d) 
       previous_node.next_node = current_node.next_node 
       if current_node.next_node is None: #deleting last node 
        current_node.prev_node=None 
       else: 
        current_node.next_node.prev_node = previous_node 
      else: 
       #it is the first node 
       self.head = current_node.next_node 
       current_node.next_node.prev_node = None 
      self.size -= 1 
      return True 

     previous_node = current_node 
     current_node = current_node.next_node 
    return False 

Working Code.希望這會有所幫助。

+0

非常感謝!現在我的代碼工作正常! –