数据结构——链表(精简易懂版)

文章目录

  • 链表概述
  • 链表的实现
    • 链表的节点(单个积木)
    • 链表的构建
      • 直接构建
      • 尾插法构建
      • 头插法构建
    • 链表的插入
  • 总结

链表概述

1,链表(Linked List)是一种常见的数据结构,用于存储一系列元素。它由一系列节点(Node)组成,每个节点包含两部分:数据域(存储数据的部分)和指针域(指向下一个节点的指针)。链表的特点是节点在内存中的存储位置不必是连续的,而是通过指针来相互连接。

具体可以想象成一个很多个积木连接的蛇

画个图大概如下(单链表):
在这里插入图片描述

链表可以分为单向链表和双向链表两种常见形式

单向链表(Singly Linked List):每个节点包含一个指针,指向下一个节点。单向链表只能从头节点开始顺序访问,无法从尾节点快速访问到头节点。(就是上面那种)

双向链表(Doubly Linked List):每个节点包含两个指针,分别指向前一个节点和后一个节点。双向链表可以从任意节点开始向前或向后遍历,相比单向链表具有更灵活的操作。

双向循环链表如下:
在这里插入图片描述

链表的优点是插入和删除操作效率高,时间复杂度为O(1),而查找操作效率相对较低,最坏情况下为O(n)。链表适用于需要频繁插入和删除操作,而对查找操作要求不高的场景。

常见的链表操作包括:插入节点、删除节点、查找节点、反转链表、合并链表等。链表在计算机科学中应用广泛,常见于实现各种数据结构和算法,如栈、队列、图等。

链表的实现

链表的节点(单个积木)

1,链表的节点是自定义的一个结构体,数据域存的东西可以自定义,可以是数字链表,也可以是字符链表等,非常灵活。

struct Node
{int val;struct Node* next;   //指针域,指向下一个节点//双向链表就在加一个指针struct Node* Pre;
};

链表的构建

直接构建

1,最直接的就是一个个链表节点直接链接,最后一个节点的指针要置空,方便判断是否到达链表的结尾,如下:

typedef struct Node
{int val;struct Node* next;
}node;int main()
{node* n1 = (node*)malloc(sizeof(node));n1->val = 1;node* n2 = (node*)malloc(sizeof(node));n2->val = 2;n1->next = n2;node* n3 = (node*)malloc(sizeof(node));n3->val = 3;n2->next = n3;n3->next = NULL;return 0;
}

尾插法构建

1,尾插即字面意思,构建一个尾指针指向链表最后一个节点,然后创建一个新节点插到尾巴后面,然后更新尾节点为新的尾。

图示

在这里插入图片描述

插入后

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构体
struct Node {int data;struct Node* next;
};// 尾插法构建链表
struct Node* createLinkedList(int arr[], int n) {struct Node *head = NULL;struct Node *tail = NULL;for (int i = 0; i < n; i++) {// 创建新节点struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {printf("Memory allocation failed.\n");exit(1);}newNode->data = arr[i];newNode->next = NULL;// 如果是第一个节点,则设置为头节点if (head == NULL) {head = newNode;tail = newNode;} else {// 否则将新节点插入到尾部tail->next = newNode;tail = newNode;}}return head;
}// 打印链表
void printLinkedList(struct Node* head) {while (head != NULL) {printf("%d ", head->data);head = head->next;}printf("\n");
}// 主函数
int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);// 使用尾插法构建链表struct Node *head = createLinkedList(arr, n);// 打印链表printf("Linked List: ");printLinkedList(head);return 0;
}

头插法构建

1,头插法也是一种常见的方法,用于构建链表。与尾插法不同,头插法是在链表的头部插入新的节点,使新节点成为链表的新头节点。

原图

在这里插入图片描述
变化

在这里插入图片描述

最终

在这里插入图片描述

下面是使用头插法构建链表的C语言示例

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构体
struct Node {int data;struct Node* next;
};// 头插法构建链表
struct Node* createLinkedList(int arr[], int n) {struct Node *head = NULL;for (int i = 0; i < n; i++) {// 创建新节点struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {printf("Memory allocation failed.\n");exit(1);}newNode->data = arr[i];// 将新节点插入到头部newNode->next = head;head = newNode;}return head;
}// 打印链表
void printLinkedList(struct Node* head) {while (head != NULL) {printf("%d ", head->data);head = head->next;}printf("\n");
}// 主函数
int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);// 使用头插法构建链表struct Node *head = createLinkedList(arr, n);// 打印链表printf("Linked List: ");printLinkedList(head);return 0;
}

链表的插入

1,链表的插入操作可以在指定位置或者指定节点之后进行。下面分别介绍两种情况的链表插入操作:

  • 在指定位置插入节点:这种情况下,需要知道要插入节点的位置,通常使用节点的索引或者位置来指定。插入操作涉及到节点的连接,需要将新节点插入到指定位置,同时调整前一个节点和后一个节点的连接关系。

  • 在指定节点之后插入节点:在这种情况下,需要先找到指定节点,然后在其后插入新节点。这个操作需要确保找到指定节点,然后调整节点的连接关系。

原(插入到1之后)

在这里插入图片描述

变化

换成代码就是

node* newnode;//(代表4节点)
node* cur;//(代表1节点)
newnode->next = cur->next;

在这里插入图片描述

最后

代码实现

cur->next = newnode;

在这里插入图片描述

下面是C语言示例代码,分别演示了在指定位置和指定节点之后进行插入操作

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构体
struct Node {int data;struct Node* next;
};// 在指定位置插入节点
void insertAtIndex(struct Node** headRef, int index, int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {printf("Memory allocation failed.\n");exit(1);}newNode->data = data;// 如果插入位置是头节点之前,则直接将新节点作为头节点if (index == 0) {newNode->next = *headRef;*headRef = newNode;return;}// 找到插入位置的前一个节点struct Node* current = *headRef;for (int i = 0; i < index - 1 && current != NULL; i++) {current = current->next;}// 如果插入位置超出链表长度,则插入失败if (current == NULL) {printf("Index out of range.\n");return;}// 插入新节点newNode->next = current->next;current->next = newNode;
}// 在指定节点之后插入节点
void insertAfterNode(struct Node* prevNode, int data) {if (prevNode == NULL) {printf("Previous node cannot be NULL.\n");return;}struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {printf("Memory allocation failed.\n");exit(1);}newNode->data = data;// 插入新节点newNode->next = prevNode->next;prevNode->next = newNode;
}// 打印链表
void printLinkedList(struct Node* head) {while (head != NULL) {printf("%d ", head->data);head = head->next;}printf("\n");
}// 主函数
int main() {struct Node* head = NULL;// 插入节点示例insertAtIndex(&head, 0, 1); // 在头部插入节点insertAtIndex(&head, 1, 3); // 在索引1位置插入节点insertAtIndex(&head, 1, 2); // 在索引1位置插入节点insertAfterNode(head->next, 4); // 在节点3之后插入节点// 打印链表printf("Linked List: ");printLinkedList(head);return 0;
}

总结

其他操作的本质上也是差不多的,都是建立新节点,修改指针指向的问题,通过画图可以更好理解的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bookends for Mac v15.0.2 文献书籍下载管理

Bookends Mac版可以轻松地将其导入参考 &#xff0c;并直接搜索和进口从数以百计的线上资料来源。Bookends Mac版使用内置在浏览器中下载参考与PDF格式的文件&#xff0c;或和/或网页的点击。 Bookends for Mac v15.0.2注册激活版下载 本文由 mdnice 多平台发布

深度学习模型训练套路与验证套路以及如何使用GPU进行模型训练

完整的模型训练套路&#xff1a;代码模板 数据集以经典的 CIFAR10 为例。 这个例子是很简单的&#xff0c;可能不太实用&#xff0c;但重点是通过这个例子掌握一种模型训练的写法套路&#xff0c;因此很有必要学习。 import torch.optim import torchvision from torch impo…

java-串口通讯-连接硬件

串口通信&#xff08;Serial Communications&#xff09;的概念非常简单&#xff0c;串口按位&#xff08;bit&#xff09;发送和接收字节。尽管比按字节&#xff08;byte&#xff09;的并行通信慢&#xff0c;但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很…

经典面试题之滑动窗口专题

class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 长度最小的子数组 // 大于等于 targetint min_len INT32_MAX;// 总和int sum 0;int start 0; // 起点for(int i 0; i< nums.size(); i) {sum nums[i];while(sum > targe…

拥抱新质生产力,助力新型工业化!CMM电子展暨IARS机器人展5月东莞盛大起航

2024年5月15-17日&#xff0c;东浩兰生会展集团旗下CMM电子展&#xff06;IARS机器人展将在广东现代国际展览中心&#xff08;东莞厚街&#xff09;举办。展会面积达50000平方米&#xff0c;展示品牌700余个&#xff0c;同期论坛峰会30余场&#xff0c;预计专业观众超50000人次…

error: pathspec ‘XXX‘ did not match any file(s) known to git

使用vscode&#xff0c;在本地开发切换分支时&#xff0c;报以下错误&#xff1a; error: pathspec XXX did not match any file(s) known to git 该问题是由于没有对应分支的原因。 首先使用一下命令&#xff0c;查看本地及远程的所有分支。 git branch -a 若没有对应的分…

极验4 一键解混淆

提示&#xff01;本文章仅供学习交流&#xff0c;严禁用于任何商业和非法用途&#xff0c;未经许可禁止转载&#xff0c;禁止任何修改后二次传播&#xff0c;如有侵权&#xff0c;可联系本文作者删除&#xff01; AST简介 AST&#xff08;Abstract Syntax Tree&#xff09;&a…

Linux专栏03:使用Xshell远程连接云服务器

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 使用Xshell远程连接云服务器 编号&#xff1a;03 文章目录 使用Xsh…

Jenkins集成Kubernetes 部署springboot项目

文章目录 准备部署的yml文件Harbor私服配置测试使用效果Jenkins远程调用参考文章 准备部署的yml文件 apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metada…

软件设计师-应用技术-数据结构及算法题4

考题形式&#xff1a; 第一题&#xff1a;代码填空 4-5空 8-10第二题&#xff1a;时间复杂度 / 代码策略第三题&#xff1a;拓展&#xff0c;跟一组数据&#xff0c;把数据带入代码中&#xff0c;求解 基础知识及技巧&#xff1a; 1. 分治法&#xff1a; 基础知识&#xff1…

语音识别--降噪

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

uniapp的app端推送功能,不使用unipush

1&#xff1a;推送功能使用htmlPlus实现&#xff1a;地址HTML5 API Reference (html5plus.org) 效果图&#xff1a; 代码实现&#xff1a; <template><view class"content"><view class"text-area"><button click"createMsg&q…

什么是DDoS攻击?DDoS攻击的原理是什么?

一、DDoS攻击概念 DDoS攻击又叫“分布式拒绝服务”(Distributed DenialofService)攻击&#xff0c;它是一种通过控制大量计算机、物联网终端或网络僵尸&#xff08;Zombie&#xff09;来向目标网站发送大量请求&#xff0c;从而耗尽其服务器资源&#xff0c;导致正常用户无法访…

设计网页用什么软件

在设计网页时&#xff0c;可以使用多种软件来完成不同的任务。以下是一些常用的网页设计软件&#xff0c;以及它们的特点和用途。 1. Adobe Photoshop&#xff1a; Adobe Photoshop 是一款功能强大的图像编辑软件。在网页设计中&#xff0c;它常用于创建和编辑网页所需的图像、…

手动配置dns后网速变慢

之前因为自动的dns能上qq但打不开网页&#xff0c;就手动设置了一个&#xff0c;结果近些天时不时出现网页图片加载慢的问题&#xff0c;影响到我看美女图片了&#xff0c;是可忍熟不可忍 测了下网速&#xff0c;很快&#xff0c;下载上传都是三位数的&#xff0c;那显然不是网…

RabbitMQ是如何保证消息可靠性的?——Java全栈知识(16)

RabbitMQ 的消息不可靠也就是 RabbitMQ 消息丢失只会发生在以下几个方面&#xff1a; 生产者发送消息到 MQ 或者 Exchange 过程中丢失。Exchange 中的消息发送到 MQ 中丢失。消息在 MQ 或者 Exchange 中服务器宕机导致消息丢失。消息被消费者消费的过程中丢失。 大致就分为生…

Star-CCM+分配零部件至区域1-将所有零部件分配至区域

前言 Star-CCM中&#xff0c;在划分网格之前需要将零部件分配至区域&#xff0c;然后才可以划分网格。如下图1所示&#xff0c;分配零部件至区域需要选择创建区域的方式、创建边界的方式以及交界面的类型。 图1 将零部件分配至区域 1 创建区域的方式选择 如下图2所示&#x…

基于Spring Boot的家具网站设计与实现

基于Spring Boot的家具网站设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统前台主界面图&#xff0c;用户可进入家具网站可查看…

探索大模型能力--prompt工程

1 prompt工程是什么 1.1 什么是Prompt&#xff1f; LLM大语言模型终究也只是一个工具&#xff0c;我们不可能每个人都去训一个大模型&#xff0c;但是我们可以思考如何利用好大模型&#xff0c;让他提升我们的工作效率。就像计算器工具一样&#xff0c;要你算10的10倍&#x…

Java IO类之FilterOutputStream的研究与应用

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…