Python数据结构 LinkedList

Python数据结构 LinkedList

一个LinkedList是一个数据元素的序列,它通过链接连接在一起。每个数据元素都包含一个与另一个数据元素的连接,其形式是一个指针。Python 在其标准库中没有LinkedList。我们使用前一章中讨论的节点的概念来实现LinkedList的概念。

我们已经看到了如何创建一个节点类以及如何遍历一个节点的元素。在这一章中,我们将研究被称为单链表的链表类型。在这种类型的数据结构中,任何两个数据元素之间只有一个链接。我们创建这样一个列表,并创建额外的方法来插入、更新和删除列表中的元素。

LinkedList的创建

通过使用我们在上一章学习的节点类来创建一个LinkedList。我们创建一个Node对象,并创建另一个类来使用这个ODE对象。我们通过节点对象传递适当的值来指向下一个数据元素。下面的程序创建了有三个数据元素的LinkedList。在下一节中,我们将看到如何遍历这个LinkedList。

class Node:
   def __init__(self, dataval=None):
      self.dataval = dataval
      self.nextval = None

class SLinkedList:
   def __init__(self):
      self.headval = None

list1 = SLinkedList()
list1.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")
# Link first Node to second node
list1.headval.nextval = e2

# Link second Node to third node
e2.nextval = e3
Python

LinkedList的遍历

单链表只可以从第一个数据元素开始,以前进的方向进行遍历。我们只需通过将下一个节点的指针分配给当前数据元素来打印下一个数据元素的值。

例子

class Node:
   def __init__(self, dataval=None):
      self.dataval = dataval
      self.nextval = None

class SLinkedList:
   def __init__(self):
      self.headval = None

   def listprint(self):
      printval = self.headval
      while printval is not None:
         print (printval.dataval)
         printval = printval.nextval

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

# Link first Node to second node
list.headval.nextval = e2

# Link second Node to third node
e2.nextval = e3

list.listprint()
Python

输出

当上述代码被执行时,它产生了以下结果 –

Mon
Tue
Wed
Python

在LinkedList中的插入

在链表中插入元素涉及到将现有节点的指针重新分配给新插入的节点。根据新的数据元素是在链表的开头、中间还是结尾插入,我们有以下几种情况。

在开始处插入

这包括将新数据节点的下一个指针指向链表的当前头部。因此,链表的当前头部成为第二个数据元素,新节点成为链表的头部。

例子

class Node:
   def __init__(self, dataval=None):
      self.dataval = dataval
      self.nextval = None

class SLinkedList:
   def __init__(self):
      self.headval = None
# Print the linked list
   def listprint(self):
      printval = self.headval
      while printval is not None:
         print (printval.dataval)
         printval = printval.nextval
   def AtBegining(self,newdata):
      NewNode = Node(newdata)

# Update the new nodes next val to existing node
   NewNode.nextval = self.headval
   self.headval = NewNode

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

list.headval.nextval = e2
e2.nextval = e3

list.AtBegining("Sun")
list.listprint()
Python

输出

当上述代码被执行时,它产生了以下结果 –

Sun
Mon
Tue
Wed
Python

在末端插入

这涉及到将LinkedList的当前最后一个节点的下一个指针指向新的数据节点。因此,当前LinkedList的最后一个节点成为第二个最后的数据节点,新节点成为LinkedList的最后一个节点。

例子

class Node:
   def __init__(self, dataval=None):
      self.dataval = dataval
      self.nextval = None
class SLinkedList:
   def __init__(self):
      self.headval = None
# Function to add newnode
   def AtEnd(self, newdata):
      NewNode = Node(newdata)
      if self.headval is None:
         self.headval = NewNode
         return
      laste = self.headval
      while(laste.nextval):
         laste = laste.nextval
      laste.nextval=NewNode
# Print the linked list
   def listprint(self):
      printval = self.headval
      while printval is not None:
         print (printval.dataval)
         printval = printval.nextval

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

list.headval.nextval = e2
e2.nextval = e3

list.AtEnd("Thu")

list.listprint()
Python

输出

当上述代码被执行时,它产生了以下结果 –

Mon
Tue
Wed
Thu
Python

在两个数据节点之间插入

这涉及到改变特定节点的指针以指向新的节点。这可以通过传入新节点和现有节点来实现,之后新节点将被插入。所以我们定义一个额外的类,它将把新节点的下一个指针改为中间节点的下一个指针。然后将新节点分配给中间节点的下一个指针。

class Node:
   def __init__(self, dataval=None):
      self.dataval = dataval
      self.nextval = None
class SLinkedList:
   def __init__(self):
      self.headval = None

# Function to add node
   def Inbetween(self,middle_node,newdata):
      if middle_node is None:
         print("The mentioned node is absent")
         return

      NewNode = Node(newdata)
      NewNode.nextval = middle_node.nextval
      middle_node.nextval = NewNode

# Print the linked list
   def listprint(self):
      printval = self.headval
      while printval is not None:
         print (printval.dataval)
         printval = printval.nextval

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Thu")

list.headval.nextval = e2
e2.nextval = e3

list.Inbetween(list.headval.nextval,"Fri")

list.listprint()
Python

输出

当上述代码被执行时,它产生了以下结果 –

Mon
Tue
Fri
Thu
Python

删除一个项目

我们可以使用该节点的键来删除一个现有的节点。在下面的程序中,我们找到要删除的节点的前一个节点。然后,将这个节点的下一个指针指向要删除的节点的下一个节点。

例子

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

   def Atbegining(self, data_in):
      NewNode = Node(data_in)
      NewNode.next = self.head
      self.head = NewNode

# Function to remove node
   def RemoveNode(self, Removekey):
      HeadVal = self.head

      if (HeadVal is not None):
         if (HeadVal.data == Removekey):
            self.head = HeadVal.next
            HeadVal = None
            return
      while (HeadVal is not None):
         if HeadVal.data == Removekey:
            break
         prev = HeadVal
         HeadVal = HeadVal.next

      if (HeadVal == None):
         return

      prev.next = HeadVal.next
      HeadVal = None

   def LListprint(self):
      printval = self.head
      while (printval):
         print(printval.data),
         printval = printval.next

llist = SLinkedList()
llist.Atbegining("Mon")
llist.Atbegining("Tue")
llist.Atbegining("Wed")
llist.Atbegining("Thu")
llist.RemoveNode("Tue")
llist.LListprint()
Python

输出

当上述代码被执行时,它产生了以下结果 –

Thu
Wed
Mon
Python

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册