在双向链接列表中的一个节点之前插入

问题描述:

我试图在一个节点之前插入一个节点到双向链接列表中。执行操作后,我没有得到正确的结果。在双向链接列表中的一个节点之前插入

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

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