本文共 4778 字,大约阅读时间需要 15 分钟。
带头结点的双链表的实现与带头结点的单链表的实现有相当高的相似性,最大的区别就是前者会多一个前驱结点指针域的操作。以下是对双链表实现的详细说明。
双链表由两个方向的链表组成,每个结点不仅包含下一个结点的指针,还包含前一个结点的指针。通过这种方式,双链表支持的操作包括插入、删除、查找以及逆序遍历等。
双链表的实现主要包含以下几个部分:
结点类
结点类DoubleLinkedNode
定义了双链表的基本单元:class DoubleLinkedNode(object): def __init__(self, data): self.data = data self.next = None self.prev = None
双链表类
双链表类DoubleLinkedList
负责管理整个双链表的逻辑:class DoubleLinkedList(object): def __init__(self): self.head = DoubleLinkedNode("头结点")
双链表的操作方法
双链表支持的主要操作包括:def IsEmpty(self): if self.GetLength() == 0: print("该链表为空!") return True else: return False
def GetLength(self): currentNode = self.head.next length = 0 while currentNode != None: length += 1 currentNode = currentNode.next return length
def Traval(self): if self.IsEmpty(): return currentNode = self.head print("当前链表为:") while currentNode != None: print(currentNode.data, end="<-> ") currentNode = currentNode.next print("")
def InsertElementInTail(self): element = input("待从尾部插入的结点的数据:") if element == "#": return currentNode = self.head newNode = DoubleLinkedNode(element) while currentNode.next != None: currentNode = currentNode.next currentNode.next = newNode newNode.prev = currentNode self.Traval()
def InsertElementInHead(self): element = input("待从头部插入的结点的数据:") if element == "#": return newNode = DoubleLinkedNode(element) newNode.next = self.head.next self.head.next = newNode newNode.prev = self.head self.Traval()
def InsertElementInSpecifiedPosition(self): Pos = 0 currentNode = self.head element, position = input("结点的数据 待插入的结点在双链表中的位置").split(" ") position = int(position) if position < 1 or position > self.GetLength() + 1: print("位置不合法!请重新确定位置!") return newNode = DoubleLinkedNode(element) while currentNode.next != None: Pos += 1 if Pos == position: newNode.next = currentNode.next currentNode.next = newNode newNode.prev = currentNode self.Traval() return else: currentNode = currentNode.next
def FindElement(self): Position = [] Pos = 0 currentNode = self.head element = input("待查找的数据:") if self.IsEmpty(): print("当前双链表为空!无法查找!") return while currentNode.next != None: currentNode = currentNode.next Pos += 1 if currentNode.data == element: Position.append(Pos) if Position: print("查找成功,值为", element, "的结点位于该双链表的第", Position, "位。") else: print("查找失败!当前双链表中不存在含有", element, "的结点")
def DeleteElementInSpecifiedPosition(self): print("在指定位置删除结点") Pos = 0 currentNode = self.head position = int(input("待删除的位置:")) if self.IsEmpty(): print("当前双链表为空!无法删除结点!") return if position < 1 or position > self.GetLength(): print("位置不合法!请重新确定位置!") return while currentNode.next != None: removedNode = currentNode.next Pos += 1 if Pos == position: currentNode.next = removedNode.next if removedNode.next == None: del removedNode else: removedNode.next.prev = currentNode del removedNode else: currentNode = currentNode.next self.Traval()
def DeleteElement(self): if self.IsEmpty(): print("当前双链表为空!") return element = input('请输入待删除结点的值:') currentNode = self.head while currentNode.next != None: removedNode = currentNode.next if removedNode.data == element: currentNode.next = removedNode.next if currentNode.next == None: del removedNode else: removedNode.next.prev = currentNode del removedNode else: currentNode = currentNode.next print("成功删除所有含值为", element, "的结点") self.Traval()
def Destory(self): print("正在销毁该链表...") del self.head print("已销毁该双链表!")
以下是双链表的实际操作示例:
创建双链表并添加元素
dl = DoubleLinkedList()dl.Create() # 调用创建方法
Enter
以继续,或输入 #
以关闭。头结点->1->2->3->4->
尾部插入元素
dl.InsertElementInTail()
4
将从尾部插入,链表变为:头结点->0->1->2->3->4->4
头部插入元素
dl.InsertElementInHead()
0
将从头部插入,链表变为:头结点->0->0->1->2->3->4->4
指定位置插入元素
dl.InsertElementInSpecifiedPosition()
100
和位置 1
将从头部插入,链表变为:头结点->100->0->0->1->2->3->4->4
查找特定数据的所有结点
dl.FindElement()
4
查找结果显示存在两个结点,分别位于第 6 位和 7 位。删除指定位置的结点
dl.DeleteElementInSpecifiedPosition()
1
的结点 0
,链表变为:头结点->0->1->2->3->4->4
删除所有特定数据的结点
dl.DeleteElement()
4
删除所有数据为 4
的结点,链表变为空:头结点->
。如需进一步了解双链表的实现和操作方法,可以在 技术文献 中查找更多相关资料。
转载地址:http://jnzrz.baihongyu.com/