探索单链表数据结构:理解与实现

文章目录

  • 🍋引言
  • 🍋什么是单链表?
  • 🍋单链表的基本操作
  • 🍋单链表的实现
  • 🍋练习题
  • 🍋总结

🍋引言

在计算机科学和数据结构中,链表是一种基本且重要的数据结构,用于存储和组织数据。单链表是其中最简单的一种形式,它由一系列节点组成,每个节点都包含一个数据元素和一个指向下一个节点的指针。在这篇博客中,我们将深入探讨单链表的工作原理以及如何用代码实现它。

最近在刷力扣的时候,发现链表这块挺重要的,所以来回忆回忆

🍋什么是单链表?

单链表是一种线性数据结构,其中的节点按照线性顺序排列。每个节点都包含两个部分:

  • 数据元素:存储实际的数据。
  • 指针(或引用):指向下一个节点的位置。

这个简单的结构允许我们在链表中添加、删除和访问元素,而不需要像数组一样具有固定的大小。这使得链表在需要频繁插入和删除元素时非常有用。

🍋单链表的基本操作

  1. 插入操作

要在单链表中插入一个新的节点,我们需要执行以下步骤:

  • 创建一个新的节点,并将要插入的数据存储在其中。
  • 将新节点的指针指向原链表中的下一个节点。
  • 更新前一个节点的指针,使其指向新节点。
  1. 删除操作

要删除链表中的节点,我们需要执行以下步骤:

  • 找到要删除的节点的前一个节点。
  • 更新前一个节点的指针,使其跳过要删除的节点,直接指向后一个节点。
  1. 访问操作
  • 要访问链表中的节点,我们可以从链表的头节点开始,依次遍历每个节点,直到找到目标节点或到达链表的末尾。

🍋单链表的实现

# 创建一个节点类(Node),用于表示单链表的节点
class Node:def __init__(self, data):self.data = data  # 存储节点的数据self.next = None  # 存储指向下一个节点的指针,默认为None# 创建一个单链表类(LinkedList)
class LinkedList:def __init__(self):self.head = None  # 初始化链表,头节点默认为None# 向链表中添加元素的方法def append(self, data):new_node = Node(data)  # 创建一个新的节点,将数据存储在其中if not self.head:  # 如果链表为空,将新节点设置为头节点self.head = new_nodereturncurrent = self.head  # 从头节点开始遍历链表while current.next:  # 移动到链表的末尾current = current.nextcurrent.next = new_node  # 将新节点连接到链表的末尾# 显示链表内容的方法def display(self):current = self.head  # 从头节点开始遍历链表while current:  # 遍历整个链表print(current.data, end=" -> ")  # 打印当前节点的数据current = current.next  # 移动到下一个节点print("None")  # 链表结束后打印 "None" 表示结束# 创建一个新的链表实例
my_linked_list = LinkedList()# 向链表中添加元素
my_linked_list.append(1)
my_linked_list.append(2)
my_linked_list.append(3)# 显示链表的内容
my_linked_list.display()

上述代码首先定义了两个类:Node 和 LinkedList。Node 类表示链表中的节点,每个节点包含一个数据元素和一个指向下一个节点的指针。LinkedList 类表示单链表,其中包含一个头节点,通过头节点可以访问整个链表。

在 LinkedList 类中,有两个主要方法:

  • append(data) 方法用于向链表中添加新的节点。它会创建一个新的节点并将其连接到链表的末尾。
  • display() 方法用于显示链表的内容。它会从头节点开始遍历链表,并打印每个节点的数据,直到链表结束。

最后,创建了一个 my_linked_list 实例,向链表中添加了三个元素(1、2 和 3),然后调用 display() 方法来显示链表的内容。

运行结果如下
在这里插入图片描述

🍋练习题

这里我们选一道我考研时期做过的题

题目:设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
首先我们要明确这题的几种可能,尤为重要的是为空的可能,我记得我之前总是遗忘

  1. 如果链表为空,递归结束。
  2. 如果链表的头结点的值等于 x,则将头结点删除,并递归调用删除函数来处理剩余的链表(即调用函数自身)。
  3. 如果链表的头结点的值不等于 x,则保留头结点,并递归调用删除函数来处理剩余的链表。
class ListNode:def __init__(self, value):self.value = valueself.next = Nonedef delete_nodes_with_value(head, x):# 递归终止条件:如果链表为空,直接返回if not head:return None# 递归处理剩余的链表head.next = delete_nodes_with_value(head.next, x)# 如果当前节点的值等于 x,则返回下一个节点,相当于删除了当前节点if head.value == x:return head.nextreturn headdef print_linked_list(head):current = headwhile current:print(current.value, end=" -> ")current = current.nextprint("None")# 创建一个示例链表:1 -> 2 -> 3 -> 2 -> 4
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(2)
node5 = ListNode(4)node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5print("原始链表:")
print_linked_list(node1)x = 2
new_head = delete_nodes_with_value(node1, x)print(f"删除值为 {x} 的节点后的链表:")
print_linked_list(new_head)

首先,我们定义了一个节点类 ListNode,该类用于表示链表的节点。每个节点有两个属性:value 用于存储节点的值,next 用于指向下一个节点。

接下来,我们定义了一个递归函数 delete_nodes_with_value(head, x),它接受链表的头节点 head 和要删除的值 x 作为参数。这个函数执行以下操作:

  • 首先,它检查递归的终止条件。如果链表为空(head 为 None),则递归结束,返回 None。
  • 否则,它递归调用自己,传递链表的下一个节点 head.next,以处理剩余的链表部分。
  • 在递归回溯时,它检查当前节点的值是否等于 x。如果相等,它将返回下一个节点 head.next,这相当于删除了当前节点。
  • 如果当前节点的值不等于 x,它将返回当前节点 head,保留当前节点,并继续处理下一个节点。

接下来,我们定义了一个辅助函数 print_linked_list(head),用于打印链表的内容,以便在删除操作后验证链表的状态。

🍋总结

单链表是一个非常有用的数据结构,用于处理各种编程问题,包括数据存储、算法实现和数据检索。希望这个解释有助于你理解如何实现和使用单链表。

请添加图片描述

挑战与创造都是很痛苦的,但是很充实。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/139304.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

常用的深度学习自动标注软件

0. 简介 自动标注软件是一个非常节省人力资源的操作,而随着深度学习的发展,这些自动化标定软件也越来越多。本文章将会着重介绍其中比较经典的自动标注软件 1. AutoLabelImg AutoLabelImg 除了labelimg的初始功能外,额外包含十多种辅助标注…

这种方法可以解决开发中的重复“造轮子”

一、前言 开发中,一直听到有人讨论是否需要重复造轮子,我觉得有能力的人,轮子得造。但是往往开发周期短,用轮子所节省的时间去更好的理解业务,应用到业务中,也能清晰发现轮子的利弊,一定意义上解…

Tomcat中文路径目录

一、问题描述 linux环境下tomcat发布了包含中文名字的页面和文件,浏览器访问报404,非中文页面没有问题;本人为RP设计的原型图发布,其中包含了大量的中文文件和路径 二、解决步骤 第一步,设置tomcat,配置…

阿里云服务器上CentOS 7.6使用rpm包安装MySQL 8.0.31

我这里下载的是最新版本,需要到MySQL官网最新版本下载地址。 要是想要下载以前的版本需要到MySQL以前版本网址中。 1)先使用wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar(这个网址现在已经不…

linux 设置打开文件数

可以使用下面的文件进行设置 /etc/security/limits.d/90-nproc.conf 先来看/etc/security/limits.d/90-nproc.conf 配置文件: [root ~]# cat /etc/security/limits.d/90-nproc.conf # Default limit for number of users processes to prevent # accidental fork…

Java中swing的5种布局方式浅析

在一个传统的java项目中,遇到一个需要调整布局的需求,下面将学习网上大佬的文章,并将过程记录下来。 1、Java swing5种布局方式 1、 边界布局(BorderLayout)2、流式布局(FlowLayout)3、网格布局…

Qt核心:元对象系统、属性系统、对象树、信号槽

一、元对象系统 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使…

1.简单工厂模式

UML类图 代码 main.cpp #include <iostream> #include "OperationFactory.h" using namespace std;int main(void) {float num1;float num2;char operate;cin >> num1 >> num2 >> operate;Operation* oper OperationFactory::createOpera…

C语言每日一题(6):求五位数中的变种水仙花数

文章主题&#xff1a;求五位数中的变种水仙花数&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&#…

阿里云服务器u1和经济型e实例有什么区别?

阿里云服务器经济型e实例和云服务器u1有什么区别&#xff1f;同CPU内存配置下云服务器u1性能更强&#xff0c;u1实例价格也要更贵一些。经济型e实例属于共享型云服务器&#xff0c;不同实例vCPU会争抢物理CPU资源&#xff0c;并导致高负载时计算性能波动不稳定&#xff0c;而云…

Linux 系统移植(一)-- 系统组成

参考资料&#xff1a; linux系统移植篇&#xff08;一&#xff09;—— linux系统组成【野火Linux移植篇】1-uboot初识与编译/烧录步骤 文章目录 一、linux系统组成二、Uboot三、Linux内核四、设备树 本篇为Linux系统移植系列的第一篇文章&#xff0c;介绍了一个完整可运行的L…

国科大体系结构习题 | 第二章 计算机系统结构基础

第二章 习题汇总 Q1. 在3台不同指令系统的计算机上运行同一程序P时&#xff0c;A机需要执行 1.0 1 0 8 1.010^8 1.0108条指令&#xff0c;B机需要执行 2.0 1 0 8 2.0 10^8 2.0108条指令&#xff0c;C机需要执行 4.0 1 0 8 4.010^8 4.0108条指令&#xff0c;但实际执行时间…

2023年贵州省职业院校技能大赛高职组信息安全管理与评估竞赛试题

2023年贵州省职业院校技能大赛高职组 信息安全管理与评估 竞赛试题 第一阶段竞赛项目试题 根据信息安全管理与评估技术文件要求&#xff0c;第一阶段为网络平台搭建与网络安全设备配置与防护。本文件为信息安全管理与评估项目竞赛-第一阶段试题。 介绍 竞赛阶段 任务阶段 竞…

9月13-14日上课内容 第三章 ELK日志分析系统及部署实例

本章结构 ELK日志分析系统简介 ELK日志分析系统分为 Elasticsearch Logstash Kibana 日志处理步骤 1.将日志进行集中化管理 2.将日志格式化(Logstash) 并输出到Elasticsearch 3.对格式化后的数据进行索引和存储 (Elasticsearch) 4.前端数据的展示(Kibana) Elasticsearch介…

企业虚拟化KVM的三种安装方式(1、完全文本2、模板镜像+配置文件3、gustos图形方式部署安装虚拟机)

一、安装完虚拟机后的操作 第一步: 第二步&#xff1a;分配的内存大一下&#xff0c;处理器多些 第三步&#xff1a;打开虚拟化 打开虚拟机、安装KVM 一般企业如果使用kvm虚拟化平台&#xff0c;都会把物理服务器装成Centos的操作系统&#xff0c;然后装上kvm&#xff0c;创建…

极客时间:数据结构与算法之美【文章笔记 实践 总结】

原文链接:https://time.geekbang.org/column/intro/100017301 27 | 递归树&#xff1a;如何借助树来求解递归算法的时间复杂度&#xff1f;如何借助树来分析归并排序算法的时间复杂度&#xff1f;如何借助树来分析快速排序算法的时间复杂度&#xff1f;如何借助递归树来分析斐波…

看阿里测试工程师如何玩转postman+newman+jenkins接口自动化

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; postman用来做接口测试非常方便&#xff0c;接口较多时&#xff0c;则可以实现接口自动化 一、环境准备…

04-Flask-新版Flask运行方式

新版Flask运行方式 前言老版本运行方式新版本运行方式命令行方式运行pycharm运行 前言 本篇来学习下新版Flask运行方式 老版本运行方式 app.run()&#xff1a;1.0之前版本 # -*- coding: utf-8 -*- # Time : 2023/9/16 # Author : 大海# 导入flask from flask import F…

Python爬虫:获取必应图片的下载链接

文章目录 1. 前言2. 实现思路3. 运行结果 1. 前言 首先&#xff0c;说明一下&#xff0c;本篇博客内容可能涉及到版权问题&#xff0c;为此&#xff0c;小编只说明一下实现思路&#xff0c;至于全部参考代码&#xff0c;小编不粘贴出来。不过&#xff0c;小编会说明详细一些&a…

ArcGIS 10.3软件安装包下载及安装教程!

【软件名称】&#xff1a;ArcGIS 10.3 【安装环境】&#xff1a;Windows 【下载链接 】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1K5ab7IHMYa23HpmuPkFa1A 提取码&#xff1a;oxbb 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 软件解压码点击原文…