2017-03-18 94 views
0

我試圖在一個節點之前插入一個節點到雙向鏈接列表中。執行操作後,我沒有得到正確的結果。在雙向鏈接列表中的一個節點之前插入

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

class Unordered_list: 
    def __init__(self): 
    self.head=None 
######Insertion at the starting### 
    def buildlst(self,data): 
    node=createnode(data) 
    if self.head is None: 
    self.head=node 
    else: 
    node.next=self.head 
    node.prev=None 
    self.head=node 
#######INsertion at the end#### 
    def buildlstend(self,data): 
    node=createnode(data) 
    ptr=self.head 
    while(ptr.next): 
     ptr=ptr.next 
    ptr.next=node 
    ptr=node.prev 

#######INsertion before some node i.e searched node#### 
    def insertbeforenode(self,data,srch_data): 
    node=createnode(data) 
    ptr=self.head 
    while(ptr): 
     if ptr.data==srch_data: 
     node.prev=ptr.prev 
     node.next=ptr 
     ptr.prev=node 
     ptr=ptr.next 


########Printitng the list########  
    def printlist(self): 
    temp=self.head  
    while(temp): 
     print(temp.data) 
     temp=temp.next  

A=Unordered_list() 
A.buildlst(10) 
A.buildlst(20) 
A.buildlstend(30) 
A.printlist() 
print("Here i will insert a new node 50 before 10") 
A.insertbeforenode(50,10) 
A.printlist() 

MYLIST看一些什麼樣的20,10,30.I希望有新的節點它打印我已經通過這個鏈接Inserting a node before a given node in doubly linked list。我的計劃是在Python這樣couldn相同results.Have 10.but前.t從中收集很多。 insertbeforenode是我從哪裏撥打電話的功能。

+1

爲什麼交叉發佈到Python和C標籤?這兩種語言的「正確方式」是非常不同的,因爲Python有內置的列表。 – torek

回答

0

Python支持一個內置的機制列表的工作,你可以很容易地做這樣的事情:

list = [] 
list.append(10) 
list.insert(0, 20) 
list.append(30) 
list.insert(1, 50) 

見更多的例子https://docs.python.org/3/tutorial/datastructures.html官方文檔。

無論如何,如果你想通過編程你的自我雙向鏈表我已經做了一些改動代碼:

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


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

    def buildlst(self, data): 
     node = createnode(data) 
     if self.head is None: 
      self.head = node 
     else: 
      node.next = self.head 
      self.head.prev = node # <--- 
      # node.prev = None <---- this is not necessary 
      self.head = node 

    def buildlstend(self, data): 
     node = createnode(data) 
     ptr = self.head 
     while ptr.next: 
      ptr = ptr.next 
     ptr.next = node 
     node.prev = ptr # <--- 

    def insertbeforenode(self, data, srch_data): 
     if srch_data == self.head.data: # <-- if you try to insert before the head 
      self.buildlst(data) 
     else: 
      node = createnode(data) 
      ptr = self.head 
      while ptr: 
       if ptr.data == srch_data: 
        node.prev = ptr.prev 
        node.next = ptr 
        ptr.prev = node 
        node.prev.next = node # <-- 
        break # <--- when you find your node you have to quit from the loop 
       else: 
        ptr = ptr.next 

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

我已經把箭頭(#< - ),我所做的更改。在處理指針和其他錯誤時存在一些錯誤。請試試這個,讓我知道!

+0

您提到的thing ** node.prev.next = node **實際上解決了我的問題。我可以知道爲什麼我需要特別的,因爲我認爲這只是一種鏈接您的prev節點的方法,tobe_insertednode,next node.so我以爲我給了足夠的鏈接像node.prev = ptr.prev,node.next = ptr,ptr.prev = node.Can你詳細說明@Checkinator – codaholic

+0

這是因爲當你有一個雙鏈表,並且你在兩個節點之間插入一個新節點你必須移動四個指針。首先設置新插入節點的前一個和下一個,然後必須在新節點(node.prev.next = node)和下一個節點的_previous-pointer_之前更改節點的_next-pointer_到新節點('ptr.prev = node')。我很抱歉單詞雙@codaholic –

+0

感謝您的解釋! – codaholic