数据结构与算法之链表 链表扩展 双向循环链表 实现

数据结构与算法阿木 发布于 2025-07-11 14 次阅读


双向循环链表实现与扩展

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。双向循环链表是链表的一种特殊形式,它不仅包含指向下一个节点的指针,还包含指向上一个节点的指针,并且链表的最后一个节点的指针指向第一个节点,形成一个循环。这种结构使得在链表中的任何位置插入或删除节点都变得非常灵活。

本文将围绕双向循环链表的数据结构,介绍其基本实现,并探讨一些扩展应用。

双向循环链表的基本实现

定义节点结构

我们需要定义链表的节点结构。每个节点包含数据部分和两个指针,分别指向前一个节点和后一个节点。

python

class Node:


def __init__(self, data):


self.data = data


self.prev = None


self.next = None


创建双向循环链表

接下来,我们创建一个双向循环链表类,它包含插入、删除、遍历等基本操作。

python

class DoublyCircularLinkedList:


def __init__(self):


self.head = None

def insert(self, data):


new_node = Node(data)


if self.head is None:


self.head = new_node


new_node.next = new_node


new_node.prev = new_node


else:


tail = self.head.prev


tail.next = new_node


new_node.prev = tail


new_node.next = self.head


self.head.prev = new_node

def delete(self, node):


if node is None or self.head is None:


return


if node == self.head:


if self.head.next == self.head:


self.head = None


else:


self.head = self.head.next


self.head.prev = tail


tail.next = self.head


else:


node.prev.next = node.next


node.next.prev = node.prev

def display(self):


if self.head is None:


return


current = self.head


while True:


print(current.data, end=' ')


current = current.next


if current == self.head:


break


测试双向循环链表

python

dll = DoublyCircularLinkedList()


dll.insert(1)


dll.insert(2)


dll.insert(3)


dll.display() 输出: 1 2 3


dll.delete(dll.head.next)


dll.display() 输出: 1 3


双向循环链表的扩展应用

1. 实现栈和队列

双向循环链表可以用来实现栈和队列。以下是使用双向循环链表实现的栈和队列的代码示例。

python

class Stack:


def __init__(self):


self.dll = DoublyCircularLinkedList()

def push(self, data):


self.dll.insert(data)

def pop(self):


if self.dll.head is None:


return None


return self.dll.delete(self.dll.head)

def peek(self):


if self.dll.head is None:


return None


return self.dll.head.data

class Queue:


def __init__(self):


self.dll = DoublyCircularLinkedList()

def enqueue(self, data):


self.dll.insert(data)

def dequeue(self):


if self.dll.head is None:


return None


return self.dll.delete(self.dll.head)


2. 实现双向循环链表的排序

我们可以使用双向循环链表来实现排序算法,如归并排序。以下是使用归并排序对双向循环链表进行排序的代码示例。

python

def merge_sort(dll):


if dll.head is None or dll.head.next == dll.head:


return dll


middle = get_middle(dll.head)


next_to_middle = middle.next


middle.next = dll.head


dll.head.prev = middle


next_to_middle.prev = dll.head

left = DoublyCircularLinkedList()


left.head = dll.head


left.tail = middle

right = DoublyCircularLinkedList()


right.head = next_to_middle


right.tail = dll.tail

left = merge_sort(left)


right = merge_sort(right)

sorted_dll = DoublyCircularLinkedList()


sorted_dll = merge(left, right)


return sorted_dll

def get_middle(node):


if node is None:


return node


slow = node


fast = node


while fast.next != node and fast.next.next != node:


slow = slow.next


fast = fast.next.next


return slow

def merge(left, right):


if left.head is None:


return right


if right.head is None:


return left

if left.head.data <= right.head.data:


temp = left.head


left.head = left.head.next


left.tail.next = merge(left, right)


left.tail = right.tail


else:


temp = right.head


right.head = right.head.next


right.tail.next = merge(left, right)


right.tail = left.tail

return temp


3. 实现双向循环链表的查找

我们可以使用双向循环链表来实现查找算法,如二分查找。以下是使用二分查找在双向循环链表中查找元素的代码示例。

python

def binary_search(dll, target):


if dll.head is None:


return False


left = dll.head


right = dll.tail


while left != right and left.prev != right:


mid = left


for _ in range((right - left) // 2):


mid = mid.next


if mid.data == target:


return True


elif mid.data < target:


left = mid.next


else:


right = mid.prev


return False


总结

双向循环链表是一种灵活且强大的数据结构,它不仅可以用于实现基本的数据操作,还可以扩展到其他应用,如栈、队列、排序和查找等。我们了解了双向循环链表的基本实现和扩展应用,希望对您有所帮助。