2017-08-11 99 views
0

我正在學習python和數據結構。我正在實施單向鏈表方法,其中包括插入頭部和給定位置。我結束了寫這個代碼:在給定位置插入節點

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

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

    def insertathead(self,new_data) : 
     new_node = Node(new_data) 
     new_node.next = self.head 
     self.head = new_node 


    def InsertNpos(self,new_data,pos): 
     start = self.head 
     if pos == 0: 
      return Node(new_data, self.head) 
     while pos > 1: 
      self.head = self.head.next 
      pos -= 1 
     self.head.next = Node(new_data, self.head.next) 
     return start 

    def PrintLinkList(self) : 
     temp = self.head 
     while (temp) : 
      print (temp.data) 
      temp = temp.next 

if __name__ == '__main__' : 
    llist = LinkedList() 
    llist.insertathead(8) 
    llist.insertathead(3)  
    llist.insertathead(10) 
    llist.insertathead(12) 
    llist.insertathead(15) 
    llist.insertathead(2) 
    llist.InsertNpos(1,2) 
    llist.PrintLinkList() 

輸出:

15 
1 
12 
10 
3 
8 

現在,在頭剛插入工作正常,但InsertNpos(1,2)給出錯誤的輸出。輸出應該是2,15,1,12,10,3,8。請告訴我我的代碼錯在哪裏。

+0

什麼是錯誤的輸出?我在位置2看到一個值爲1的節點...或者您的編號從0開始?我們需要清楚地描述你預期會發生什麼,以及爲什麼。 – Prune

+0

當你說'給出錯誤的輸出'時,請指定輸出應該是什麼。 –

+0

您在'InsertNpos()'中使用'self.head'來遍歷鏈表,這意味着你失去了真正的'head'。我認爲'self.head = start'可能是簡單的修復,但你可能只是想用'start'來遍歷列表。即使在基本情況下插入'0'不會更新'self.head' – AChampion

回答

0

當你插入的位置POS,您插入常規刪除第一POS-1列表的元素。它更改每次迭代的頭指針。你需要一個局部變量遍歷列表。另外,你爲什麼要返回一個值?你從不使用它。此方法的唯一目的是更新列表。

def InsertNpos(self,new_data,pos): 
    if pos == 0: 
     self.head = Node(new_data, self.head) 
     return 

    start = self.head 
    while pos > 1: 
     start = start.next 
     pos -= 1 
    start.next = Node(new_data, start.next) 

新的輸出:

Before insertion 
2 
15 
12 
10 
3 
8 
After insertion 
2 
15 
1 
12 
10 
3 
8 
+1

看起來像一個剪切和粘貼錯誤......這是否處理基本情況插入@ 0「 - 」如果pos == 0:self.head =節點(...,self.head);返回' – AChampion

+0

@ AChampion @ prune謝謝你們解釋。 –

+0

@AChampion - exactly;謝謝你的修理。 – Prune

0

即使答案已經被接受,我試圖解決方案,併爲AChampion建議它沒有爲我工作在0插入,但我的解決方案做了:

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

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

    def insertathead(self,new_data) : 
     new_node = Node(new_data) 
     new_node.next = self.head 
     self.head = new_node 


    def InsertNpos(self,new_data,pos): 
     if pos == 0: 
      self.head = Node(new_data, self.head) 
      return self.head 
     i = 0 
     curr = self.head 
     while curr.next: 
      if i == pos - 1: 
       curr.next = Node(new_data, curr.next) 
       return self.head 
      curr = curr.next 
      i += 1 
     curr.next = Node(new_data) 
     return self.head 

    def PrintLinkList(self) : 
     temp = self.head 
     while (temp) : 
      print (temp.data) 
      temp = temp.next 

如果pos超出範圍,將在最後插入項目。