链表实现(链表实现电子相册)

## 链表实现### 简介链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表中的节点可以在内存中非连续地存储,这使得它们在动态内存分配方面具有优势。链表广泛应用于各种数据结构和算法中,例如栈、队列、图和哈希表。### 链表类型常见的链表类型包括:#### 1. 单链表单链表是最基本类型的链表,每个节点只包含数据和指向下一个节点的指针。

结构:

```python class Node:def __init__(self, data):self.data = dataself.next = None ```

操作:

插入节点:在指定位置插入新节点,例如在头节点、尾节点或其他节点之前或之后插入。

删除节点:删除指定节点,包括头节点、尾节点或其他节点。

遍历链表:从头节点开始,依次访问每个节点,直到到达尾节点。#### 2. 双链表双链表与单链表类似,但每个节点除了指向下一个节点的指针外,还包含指向前一个节点的指针。

结构:

```python class Node:def __init__(self, data):self.data = dataself.prev = Noneself.next = None ```

操作:

插入节点:在指定位置插入新节点,操作类似于单链表,但需要更新前后节点的指针。

删除节点:删除指定节点,操作类似于单链表,但需要更新前后节点的指针。

双向遍历:可以从头节点或尾节点开始,向两个方向遍历链表。#### 3. 循环链表循环链表是单链表或双链表的一种特殊形式,其中尾节点的指针指向头节点,形成一个闭环。

结构:

```python # 单循环链表 class Node:def __init__(self, data):self.data = dataself.next = None# 双循环链表 class Node:def __init__(self, data):self.data = dataself.prev = Noneself.next = None ```

操作:

插入节点:插入节点操作类似于单链表或双链表,但需要更新尾节点的指针。

删除节点:删除节点操作类似于单链表或双链表,但需要更新尾节点的指针。

循环遍历:可以从任意节点开始,循环遍历链表。### 链表实现以下是用 Python 代码实现单链表和双链表的示例:#### 1. 单链表实现```python class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef append(self, data):new_node = Node(data)if self.head is None:self.head = new_nodereturncurrent = self.headwhile current.next:current = current.nextcurrent.next = new_nodedef insert(self, data, index):new_node = Node(data)if index == 0:new_node.next = self.headself.head = new_nodereturncurrent = self.headcount = 0while current and count < index - 1:current = current.nextcount += 1if current is None:returnnew_node.next = current.nextcurrent.next = new_nodedef delete(self, data):if self.head is None:returncurrent = self.headprevious = Nonewhile current:if current.data == data:if previous is None:self.head = current.nextelse:previous.next = current.nextreturnprevious = currentcurrent = current.nextdef print_list(self):current = self.headwhile current:print(current.data, end=" ")current = current.nextprint()# 示例 linked_list = LinkedList() linked_list.append(1) linked_list.append(2) linked_list.append(3) linked_list.insert(4, 2) linked_list.delete(2) linked_list.print_list() # 输出: 1 4 3 ```#### 2. 双链表实现```python class Node:def __init__(self, data):self.data = dataself.prev = Noneself.next = Noneclass DoublyLinkedList:def __init__(self):self.head = Nonedef append(self, data):new_node = Node(data)if self.head is None:self.head = new_nodereturncurrent = self.headwhile current.next:current = current.nextcurrent.next = new_nodenew_node.prev = currentdef insert(self, data, index):new_node = Node(data)if index == 0:new_node.next = self.headif self.head:self.head.prev = new_nodeself.head = new_nodereturncurrent = self.headcount = 0while current and count < index - 1:current = current.nextcount += 1if current is None:returnnew_node.next = current.nextif current.next:current.next.prev = new_nodecurrent.next = new_nodenew_node.prev = currentdef delete(self, data):if self.head is None:returncurrent = self.headwhile current:if current.data == data:if current.prev is None:self.head = current.nextif self.head:self.head.prev = Noneelse:current.prev.next = current.nextif current.next:current.next.prev = current.prevreturncurrent = current.nextdef print_list(self):current = self.headwhile current:print(current.data, end=" ")current = current.nextprint()# 示例 doubly_linked_list = DoublyLinkedList() doubly_linked_list.append(1) doubly_linked_list.append(2) doubly_linked_list.append(3) doubly_linked_list.insert(4, 2) doubly_linked_list.delete(2) doubly_linked_list.print_list() # 输出: 1 4 3 ```### 链表的优缺点#### 优点:

动态内存分配:

链表的节点可以在运行时动态分配内存,无需预先知道数据的大小。

灵活插入和删除:

在链表中插入和删除节点比数组更容易,只需修改指针即可,无需移动其他节点。

存储不连续数据:

链表中的节点可以在内存中非连续地存储,适用于存储具有不规则结构的数据。#### 缺点:

随机访问困难:

要访问链表中的某个节点,需要从头节点开始遍历,无法直接访问特定索引的节点。

额外空间开销:

每个节点都需要额外的空间来存储指针,这会增加空间开销。

指针操作复杂:

链表的操作需要处理指针,比数组操作更复杂。### 应用场景链表适用于以下场景:

需要动态分配内存,数据大小未知。

需要频繁插入和删除节点。

需要存储具有不规则结构的数据。

栈、队列、图和哈希表等数据结构的实现。### 总结链表是一种灵活、高效的数据结构,它在各种数据结构和算法中扮演着重要角色。通过选择合适的链表类型,我们可以根据实际需求设计出满足特定需求的数据结构。

链表实现

简介链表是一种线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表中的节点可以在内存中非连续地存储,这使得它们在动态内存分配方面具有优势。链表广泛应用于各种数据结构和算法中,例如栈、队列、图和哈希表。

链表类型常见的链表类型包括:

1. 单链表单链表是最基本类型的链表,每个节点只包含数据和指向下一个节点的指针。**结构:**```python class Node:def __init__(self, data):self.data = dataself.next = None ```**操作:*** 插入节点:在指定位置插入新节点,例如在头节点、尾节点或其他节点之前或之后插入。 * 删除节点:删除指定节点,包括头节点、尾节点或其他节点。 * 遍历链表:从头节点开始,依次访问每个节点,直到到达尾节点。

2. 双链表双链表与单链表类似,但每个节点除了指向下一个节点的指针外,还包含指向前一个节点的指针。**结构:**```python class Node:def __init__(self, data):self.data = dataself.prev = Noneself.next = None ```**操作:*** 插入节点:在指定位置插入新节点,操作类似于单链表,但需要更新前后节点的指针。 * 删除节点:删除指定节点,操作类似于单链表,但需要更新前后节点的指针。 * 双向遍历:可以从头节点或尾节点开始,向两个方向遍历链表。

3. 循环链表循环链表是单链表或双链表的一种特殊形式,其中尾节点的指针指向头节点,形成一个闭环。**结构:**```python

单循环链表 class Node:def __init__(self, data):self.data = dataself.next = None

双循环链表 class Node:def __init__(self, data):self.data = dataself.prev = Noneself.next = None ```**操作:*** 插入节点:插入节点操作类似于单链表或双链表,但需要更新尾节点的指针。 * 删除节点:删除节点操作类似于单链表或双链表,但需要更新尾节点的指针。 * 循环遍历:可以从任意节点开始,循环遍历链表。

链表实现以下是用 Python 代码实现单链表和双链表的示例:

1. 单链表实现```python class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef append(self, data):new_node = Node(data)if self.head is None:self.head = new_nodereturncurrent = self.headwhile current.next:current = current.nextcurrent.next = new_nodedef insert(self, data, index):new_node = Node(data)if index == 0:new_node.next = self.headself.head = new_nodereturncurrent = self.headcount = 0while current and count < index - 1:current = current.nextcount += 1if current is None:returnnew_node.next = current.nextcurrent.next = new_nodedef delete(self, data):if self.head is None:returncurrent = self.headprevious = Nonewhile current:if current.data == data:if previous is None:self.head = current.nextelse:previous.next = current.nextreturnprevious = currentcurrent = current.nextdef print_list(self):current = self.headwhile current:print(current.data, end=" ")current = current.nextprint()

示例 linked_list = LinkedList() linked_list.append(1) linked_list.append(2) linked_list.append(3) linked_list.insert(4, 2) linked_list.delete(2) linked_list.print_list()

输出: 1 4 3 ```

2. 双链表实现```python class Node:def __init__(self, data):self.data = dataself.prev = Noneself.next = Noneclass DoublyLinkedList:def __init__(self):self.head = Nonedef append(self, data):new_node = Node(data)if self.head is None:self.head = new_nodereturncurrent = self.headwhile current.next:current = current.nextcurrent.next = new_nodenew_node.prev = currentdef insert(self, data, index):new_node = Node(data)if index == 0:new_node.next = self.headif self.head:self.head.prev = new_nodeself.head = new_nodereturncurrent = self.headcount = 0while current and count < index - 1:current = current.nextcount += 1if current is None:returnnew_node.next = current.nextif current.next:current.next.prev = new_nodecurrent.next = new_nodenew_node.prev = currentdef delete(self, data):if self.head is None:returncurrent = self.headwhile current:if current.data == data:if current.prev is None:self.head = current.nextif self.head:self.head.prev = Noneelse:current.prev.next = current.nextif current.next:current.next.prev = current.prevreturncurrent = current.nextdef print_list(self):current = self.headwhile current:print(current.data, end=" ")current = current.nextprint()

示例 doubly_linked_list = DoublyLinkedList() doubly_linked_list.append(1) doubly_linked_list.append(2) doubly_linked_list.append(3) doubly_linked_list.insert(4, 2) doubly_linked_list.delete(2) doubly_linked_list.print_list()

输出: 1 4 3 ```

链表的优缺点

优点:* **动态内存分配:**链表的节点可以在运行时动态分配内存,无需预先知道数据的大小。 * **灵活插入和删除:**在链表中插入和删除节点比数组更容易,只需修改指针即可,无需移动其他节点。 * **存储不连续数据:**链表中的节点可以在内存中非连续地存储,适用于存储具有不规则结构的数据。

缺点:* **随机访问困难:**要访问链表中的某个节点,需要从头节点开始遍历,无法直接访问特定索引的节点。 * **额外空间开销:**每个节点都需要额外的空间来存储指针,这会增加空间开销。 * **指针操作复杂:**链表的操作需要处理指针,比数组操作更复杂。

应用场景链表适用于以下场景:* 需要动态分配内存,数据大小未知。 * 需要频繁插入和删除节点。 * 需要存储具有不规则结构的数据。 * 栈、队列、图和哈希表等数据结构的实现。

总结链表是一种灵活、高效的数据结构,它在各种数据结构和算法中扮演着重要角色。通过选择合适的链表类型,我们可以根据实际需求设计出满足特定需求的数据结构。

标签列表