数据结构与算法之链表 双向链表实现 前驱指针维护

数据结构与算法阿木 发布于 6 天前 3 次阅读


摘要:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。双向链表是链表的一种,它不仅包含指向下一个节点的指针,还包含指向前一个节点的指针。本文将围绕双向链表的数据结构与算法实现,进行详细的分析和代码编写。

一、双向链表概述

1. 定义

双向链表是一种链式存储结构,它的每个节点包含三个部分:数据域、前驱指针域和后继指针域。其中,数据域存储数据,前驱指针域指向当前节点的前一个节点,后继指针域指向当前节点的下一个节点。

2. 特点

(1)插入和删除操作方便,只需修改前驱和后继指针即可。

(2)可以方便地实现数据的遍历。

(3)查找操作较为复杂,需要从头节点开始遍历。

二、双向链表实现

1. 节点定义

我们需要定义一个双向链表的节点类,包含数据域、前驱指针域和后继指针域。

python

class Node:


def __init__(self, data):


self.data = data


self.prev = None


self.next = None


2. 双向链表类定义

接下来,我们定义一个双向链表类,包含头节点、尾节点和节点数量等属性。

python

class DoublyLinkedList:


def __init__(self):


self.head = None


self.tail = None


self.size = 0


3. 插入操作

插入操作包括头插法、尾插法和指定位置插入。

(1)头插法

python

def insert_head(self, data):


new_node = Node(data)


if self.head is None:


self.head = new_node


self.tail = new_node


else:


new_node.next = self.head


self.head.prev = new_node


self.head = new_node


self.size += 1


(2)尾插法

python

def insert_tail(self, data):


new_node = Node(data)


if self.tail is None:


self.head = new_node


self.tail = new_node


else:


new_node.prev = self.tail


self.tail.next = new_node


self.tail = new_node


self.size += 1


(3)指定位置插入

python

def insert_position(self, data, position):


if position < 0 or position > self.size:


raise IndexError("Position out of range")


if position == 0:


self.insert_head(data)


elif position == self.size:


self.insert_tail(data)


else:


new_node = Node(data)


current = self.head


for _ in range(position - 1):


current = current.next


new_node.prev = current


new_node.next = current.next


current.next.prev = new_node


current.next = new_node


self.size += 1


4. 删除操作

删除操作包括删除头节点、删除尾节点和指定位置删除。

(1)删除头节点

python

def delete_head(self):


if self.head is None:


raise IndexError("List is empty")


if self.head == self.tail:


self.head = None


self.tail = None


else:


self.head = self.head.next


self.head.prev = None


self.size -= 1


(2)删除尾节点

python

def delete_tail(self):


if self.tail is None:


raise IndexError("List is empty")


if self.head == self.tail:


self.head = None


self.tail = None


else:


self.tail = self.tail.prev


self.tail.next = None


self.size -= 1


(3)指定位置删除

python

def delete_position(self, position):


if position < 0 or position >= self.size:


raise IndexError("Position out of range")


if position == 0:


self.delete_head()


elif position == self.size - 1:


self.delete_tail()


else:


current = self.head


for _ in range(position):


current = current.next


current.prev.next = current.next


current.next.prev = current.prev


self.size -= 1


5. 遍历操作

遍历操作包括正向遍历和反向遍历。

(1)正向遍历

python

def traverse_forward(self):


current = self.head


while current:


print(current.data)


current = current.next


(2)反向遍历

python

def traverse_backward(self):


current = self.tail


while current:


print(current.data)


current = current.prev


三、总结

本文详细介绍了双向链表的数据结构与算法实现,包括节点定义、双向链表类定义、插入操作、删除操作和遍历操作。通过本文的学习,读者可以掌握双向链表的基本操作,为后续学习更复杂的数据结构和算法打下基础。

在实际应用中,双向链表广泛应用于各种场景,如数据库索引、栈、队列等。熟练掌握双向链表,有助于提高编程能力和解决实际问题的能力。