2015-01-09 70 views
0

我必須在堆棧中編寫一個鏈表,這意味着我可以刪除頂部的數字並從堆棧的頂端推送一個數字。不幸的是我的pop()方法FUNC不工作,我希望你能幫助我:從鏈表中刪除一個節點(堆棧)

# ---------------init-------------- 
class node: 
    def __init__(self): 
     self.data = None # contains the data 
     self.next = None # contains the reference to the next node 


class linked_list: 
    def __init__(self): 
     self.cur_node = None 

# ---------------is_empty-------------- 
    def is_empty(self): 
    if self.cur_node == None: 
     print ("list is empty") 
    else: 
     print ("List = ") 
     ll.list_print() 

# ---------------is_full-------------- 

# ---------------push-------------- 

    def push(self, data): 
     new_node = node() # create a new node 
     new_node.data = data 
     new_node.next = self.cur_node # link the new node to the 'previous' node. 
     self.cur_node = new_node # set the current node to the new one. 

# ---------------pop-------------- 

    def pop(self): 
    print(node) 
    node = self.cur_node 
    while node: 
     if node.next == None: 
     node = None 
     break 
     else: 
     node=node.next 


# ---------------print-------------- 
    def list_print(self): 
     ... 


ll = linked_list() 

ll.is_empty() 
ll.push(1) 
ll.push(3) 
ll.push(2) 
ll.is_empty() 
ll.pop() 
ll.list_print() 

流行之前,電流輸出()是

2 
3 
1 

pop()方法之後,它應該是

3 
1 
+2

我不知道python,但顯然在你的'pop'中,你不會改變'self.cur_node',但只需按照堆棧的底部。剛剛使用'self.cur_node = self.cur_node.next'怎麼樣? – Codor 2015-01-09 20:12:36

+0

@Codor我的教授給了我一個寫函數is_full()的練習。在我看來,不可能找到一個完整的鏈表,因爲你總是可以創建一個「新節點」。我猜,這是他的錯......你覺得呢? – WirJun 2015-01-09 20:20:46

+0

@Codor沒錯,就這麼簡單。 – augurar 2015-01-09 21:12:06

回答

1

您的代碼當前迭代通過堆棧,不會修改任何內容。

考慮函數調用時堆棧的狀態。在你的榜樣,是這樣的:

stack before pop

調用pop()後,你希望它是這樣的:

stack after pop

因此,所有你需要做的是設置self.cur_nodeself.cur_node.next。您不必做任何事情來刪除包含2的節點,Python將在不再引用它時自動執行此操作。

0

pop功能可能是這樣可以幫到你

def pop(self, i): 
     '''(LinkedList, int) -> NoneType 
     Remove and return item at index. Raise IndexError if list is empty or 
     index is out of range.''' 

     if i < 0 or i >= self.num_elements: 
      raise IndexError("pop index out of range") 
     if i == 0: 
      result = self.front.key 
      self.front = self.front.next 
     else: 
      node = self.front 
      for j in range(i - 1): 
       node = node.next 
      result = node.next.key 
      node.next = node.next.next 
     self.num_elements -= 1 
     return result 
+0

與此func你可以搜索一個數字並刪除它,但我必須刪除最後一個元素,而不告訴編譯器刪除特殊位置上的特殊數字 – WirJun 2015-01-09 20:24:16

+1

def PopNode(self,index): prev =無 節點= self.head I = 0 而和(i <索引)(節點=無!): 先前=節點 節點= node.next I + = 1 如果一個先前==無: 自.head = node.next else: prev.next = node.next – Mobitips 2015-01-09 20:27:22

+0

爲他完成OP的任務不會幫助他,再加上這個實現on與原始代碼具有不同的簽名,甚至不起作用(它期望節點具有'key'屬性,而不是它們)。 – augurar 2015-01-09 21:04:12