2015-08-20 91 views
4

要在鏈表中刪除一個節點,什麼是錯的這個實現?:刪除節點鏈表在python

def delete(self, val): 
    tmp = self.head 
    prev = None 
    while tmp: 
     if val == tmp.data: 
      self.size -= 1 
      if prev==None: 
       self.head = self.head.next 
      else: 
       prev.next = tmp.next 
     else: 
      prev = tmp 
      tmp = tmp.next 

我已經看過了所有的導遊說,這應該是:

def delete(self, data): 
    tmp = self.head 
    prev = None 
    found = False 
    while tmp and not found: 
     if data == tmp.data: 
      found = True 
     else: 
      prev = tmp 
      tmp = tmp.next 
    if found: 
     self.size -= 1 
     if prev == None: 
      self.head = self.head.next 
     else: 
      prev.next = tmp.next 

我想不通爲什麼發現需要。爲什麼發現有必要?爲什麼這個實現更加正確?

此外,我也有同樣的煩惱與搜索

我的實現是:

def __contains__(self, data): 
    tmp = self.head 
    while tmp: 
     if data == tmp.data: 
      return True 
     else: 
      tmp = tmp.next 
    return False 

但正確的實現是:

def __contains__(self, data): 
     tmp = self.head 
     found = False 
     while tmp and not found: 
      if data == tmp.data: 
       found = True 
      else: 
       tmp = tmp.next 
     return found 
+0

嗯,你的刪除看起來不錯。它工作不正常嗎?從本質上講,你只是將代碼從if中刪除,並且如果條件是真的,那麼就放置它,這很好。另外,我認爲指南的實施,如果發現應該多一次標籤。發現錯誤 – FirebladeDan

+0

找到用於退出某個節點的循環。 –

+0

@CurlyJoe:哦,這很有意義。那麼**搜索**怎麼樣?爲了搜索,我也退出了 - 我確定我的實現更好,因爲它更簡潔,但我覺得我錯過了一些明顯的東西。 – polarbeargirl

回答

2

delete s如相同只要數據是唯一的。所以一般來說,更好的做法是單獨循環遍歷列表中的元素。它更可讀,嵌套更少。如果找不到data

def delete(self, data): 
    tmp = self.head 
    prev = None 
    while tmp: 
     if data == tmp.data: 
      break 
     prev = tmp 
     tmp = tmp.next 
    else: 
     raise ValueError('data not found') 
    self.size -= 1 
    if prev is None: 
     self.head = tmp.next 
    else: 
     prev.next = tmp.next 
+0

@ head.next'和'prev.next'的想法,但這是無意義的。 – Daniel