链表(Linked List)详解

简介: 链表(Linked List)详解

链表概述

链表是一种常见的数据结构,它允许我们在内存中动态地分配元素。与数组不同,链表中的元素在内存中并不是连续存放的,而是通过指针或引用来连接。链表中的每一个元素都称为一个节点(Node),节点包含两部分信息:一部分是存储的数据元素(data),另一部分是指向下一个节点的指针(next)。

链表有很多种类,如单向链表、双向链表、循环链表等。这里我们以单向链表为例进行说明。

链表的特点

动态分配:链表中的节点可以根据需要动态地创建和删除。

非连续存储:链表中的元素在内存中不是连续存放的,而是通过指针或引用来连接。

插入和删除操作方便:在链表中插入或删除一个节点,只需要修改相关节点的指针即可,不需要移动大量的数据。

链表的基本操作

插入节点:在链表的指定位置插入一个新的节点。

删除节点:删除链表中的指定节点。

遍历链表:从链表的头节点开始,依次访问链表中的每一个节点。

链表的基本实现(Python示例)

以下是一个简单的单向链表实现的示例代码:

python复制代码

  class Node: 
  
  def __init__(self, data=None): 
  self.data = data 
  self.next = None 
  
  class LinkedList: 
  def __init__(self): 
  self.head = None 
  
  # 插入节点到链表末尾 
  def append(self, data): 
  if not self.head: 
  self.head = Node(data) 
  else: 
  cur = self.head 
  while cur.next: 
  cur = cur.next 
  cur.next = Node(data) 
  
  # 插入节点到链表指定位置(0为头节点位置) 
  def insert(self, position, data): 
  if position <= 0: 
  new_node = Node(data) 
  new_node.next = self.head 
  self.head = new_node 
  else: 
  cur = self.head 
  count = 0 
  while cur and count < position - 1: 
  cur = cur.next 
  count += 1 
  if cur is None: 
  return # 插入位置超出链表长度 
  new_node = Node(data) 
  new_node.next = cur.next 
  cur.next = new_node 
  
  # 删除指定节点(根据数据值删除) 
  def delete(self, data): 
  if not self.head: 
  return 
  if self.head.data == data: 
  self.head = self.head.next 
  return 
  cur = self.head 
  while cur.next: 
  if cur.next.data == data: 
  cur.next = cur.next.next 
  return 
  cur = cur.next 
  
  # 遍历链表并打印数据 
  def display(self): 
  cur = self.head 
  while cur: 
  print(cur.data, end=' ') 
  cur = cur.next 
  print() 
  
  # 示例 
  if __name__ == "__main__": 
  ll = LinkedList() 
  ll.append(1) 
  ll.append(2) 
  ll.append(3) 
  ll.insert(1, 4) 
  ll.display() # 输出:1 4 2 3 
  ll.delete(2) 
  ll.display() # 输出:1 4 3

总结

链表是一种重要的数据结构,它通过指针或引用来连接节点,实现数据的动态存储和访问。链表具有动态分配、非连续存储和方便的插入删除操作等特点,广泛应用于各种场景中。通过上面的示例代码,我们可以更好地理解和掌握链表的基本操作和实现。


目录
相关文章
|
27天前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
14天前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
15 2
|
11天前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
15 0
|
1月前
|
算法 测试技术
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
|
1月前
|
存储 算法 Java
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
|
1月前
|
算法
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
|
20天前
|
存储 NoSQL Redis
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
|
1月前
|
测试技术 C语言
如何用C语言实现无头单向非循环链表Single List ?
这篇文档介绍了一个关于单链表数据结构的实现和相关操作。单链表是一种线性数据结构,每个元素(节点)包含数据和指向下一个节点的指针。文档中列出了单链表的图示,并提供了C语言实现单链表的代码,包括动态申请节点、打印链表、头插、尾插、头删、尾删、查找和在特定位置插入或删除节点等函数。 此外,文档还包含了三个测试用例(TestSList1至TestSList4),展示了如何使用这些函数创建、修改和操作单链表。这些测试用例涵盖了插入、删除、查找等基本操作,以及在链表中特定位置插入和删除节点的场景。
23 0
|
1月前
|
设计模式 测试技术
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
28 1
|
1月前
|
存储 算法 Linux
【C/C++ 线性表】C++ 从零开始实现 双向循环链表(Exploring Doubly Circular Linked List in C++)
【C/C++ 线性表】C++ 从零开始实现 双向循环链表(Exploring Doubly Circular Linked List in C++)
71 0