2016-12-27 76 views
0

我的代碼如下,用於刪除鏈接列表中的節點不起作用,因爲它正在刪除我想要刪除的索引的錯誤索引。從鏈接列表中刪除節點不起作用

class Node: 
    def __init__(self,data): 
     self.data=data 
     self.next=None 

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

    def Addnode(self,data): 
     new_node=Node(data) 
     if self.head==None: 
      self.head=new_node 
     if self.tail!=None: 
      self.tail.next=new_node 
     self.tail=new_node 

    def removenode(self,index): 
     new_n=self.head 
     count=0 
     while count!=index: 
      new_n=new_n.next 
      count+=1 
     new_n.next=new_n.next.next 
    def Printlist(self): 
     node=self.head 
     while node!=None: 
      print(node.data) 
      node=node.next 

List=LinkedList() 
List.Addnode(1) 
List.Addnode(2) 
List.Addnode(3) 
List.Addnode(4) 
List.removenode(1) 
List.Printlist() 

所以這應該刪除節點是在索引1,它是2,而是它消除3,並打印和1,2,4-不甚至5任?我很困惑,爲什麼會發生這種情況?

+0

也許增加編程語言標籤將有助於 –

+1

這是Python嗎? –

+0

是的,對不起, – garfieldluva

回答

2

您的移除功能太過分了。讓我們通過它,刪除第一個節點(如在您的代碼中)。

new_n=self.head 

new_n現在指向頭節點。這是我們想要的,所以它是正確的。

count=0 

將計數初始化爲零。這也是正確的,因爲當前節點是節點零。

while count!=index: 
    new_n=new_n.next 
    count+=1 

這是我們得到意想不到的行爲的地方。在第一次迭代中(從0!= 1開始),我們進入循環。現在new_n指向列表中的第二個元素(索引1),並且count是1.

現在我們再次嘗試循環條件。 count現在等於index,所以我們跳出循環。

當前new_n現在指向列表中的第二個元素(索引1),因此new_n.next=new_n.next.next將下一個元素更改爲當前下一個元素之後的元素。這是從鏈表中移除一個元素的方法,但是我們關閉了一個元素(我們遍歷了這個列表)。爲了解決這個問題,請嘗試以下代碼:

def removenode(self,index): 
    # catch the edge condition where we're removing the first node 
    if index==0 
     self.head = self.head.next 
    else 
     new_n=self.head 
     count=1 
     while count!=index: 
      new_n=new_n.next 
      count+=1 
     new_n.next=new_n.next.next 

免責聲明:我沒有Python的這臺電腦上,所以我無法測試的代碼,但希望將它分解這種方式幫助。

+0

哇,非常感謝您的詳細解釋!它的作品謝謝你! – garfieldluva