Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构和算法之链表 | 链表介绍(难度级别:简单)

数据结构和算法之链表 | 链表介绍(难度级别:简单)

作者头像
海拥
发布于 2021-08-23 09:44:04
发布于 2021-08-23 09:44:04
59300
代码可运行
举报
文章被收录于专栏:全栈技术全栈技术
运行总次数:0
代码可运行

与数组一样,链表是一种线性数据结构。与数组不同,链表元素不存储在连续的位置;元素使用指针链接。

为什么使用链表?

数组可用于存储类似类型的线性数据,但数组有以下限制。 1)数组的大小是固定的:所以我们必须提前知道元素数量的上限。此外,一般而言,分配的内存与使用情况无关,等于上限。 2)在元素数组中插入一个新元素是昂贵的,因为必须为新元素创建房间,并且必须移动现有元素才能创建房间。

例如,在一个系统中,如果我们在数组 id[] 中维护一个已排序的 ID 列表。 id[] = [1000, 1010, 1050, 2000, 2040]。

而如果我们要插入一个新的ID 1005,那么为了保持排序顺序,我们必须将1000之后的所有元素(不包括1000)移动。

除非使用某些特殊技术,否则删除数组的代价也很高。例如,要删除 id[] 中的 1010,必须移动 1010 之后的所有内容。

优于数组的优点

1)动态大小 2)易于插入/删除

缺点:

1)不允许随机访问。我们必须从第一个节点开始按顺序访问元素。所以我们不能用它的默认实现有效地对链表进行二分搜索。在这里阅读。 2)列表的每个元素都需要额外的指针存储空间。 3) 对缓存不友好。由于数组元素是连续的位置,因此存在引用的局部性,而在链表的情况下则不存在。

表示:

链表由指向链表第一个节点的指针表示。第一个节点称为头部。如果链表为空,则头部的值为NULL。

列表中的每个节点至少由两部分组成:

1) 数据 2) 指向下一个节点的指针(或引用)

在 C 中,我们可以使用结构来表示一个节点。下面是一个带有整数数据的链表节点的例子。 在 Java 或 C# 中,LinkedList 可以表示为一个类,而一个 Node 可以表示为一个单独的类。LinkedList 类包含一个 Node 类类型的引用。

第一个简单链表

1.C

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//一个链表节点
struct Node {
	int data;
	struct Node* next;
};

2.C++

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Node {
public:
	int data;
	Node* next;
};

3.Java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LinkedList {
    Node head; // head of the list
    /* 链表节点*/
    class Node {
        int data;
        Node next;
        // 创建新节点的构造函数
        // next  默认初始化为 null
        Node(int d) { data = d; }
    }
}

4.Python

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Node:

	# 初始化节点对象的函数
	def __init__(self, data):
		self.data = data # 分配数据
		self.next = None # 将 next 初始化为 null

class LinkedList:	
	# 初始化链表对象的函数
	def __init__(self):
		self.head = None

5.C#

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LinkedList {
	// 链表的第一个节点(head)
	// 将是 Node 类型的对象(默认为 null)
	Node head;
	class Node {
		int data;
		Node next;
		// 创建新节点的构造函数
		Node(int d) { data = d; }
	}
}

让我们创建一个具有 3 个节点的简单链表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 一个示例 C++ 程序来介绍
// 一个链表
#include <bits/stdc++.h>
using namespace std;

class Node {
public:
	int data;
	Node* next;
};

// 程序创建一个简单的链接
// 包含 3 个节点的列表
int main()
{
	Node* head = NULL;
	Node* second = NULL;
	Node* third = NULL;

	// 在堆中分配 3 个节点
	head = new Node();
	second = new Node();
	third = new Node();

	/* 三个块已被动态分配。
		我们有指向这三个块的指针作为头部,
		第二个和第三个
	head		 second		 third
		|			 |			 |
		|			 |			 |
	+---+-----+	 +----+----+	 +----+----+
	| # | # |	 | # | # |	 | # | # |
	+---+-----+	 +----+----+	 +----+----+
	
# 代表任何随机值。
数据是随机的,因为我们没有分配
什么都还没有 */

	head->data = 1; // 在第一个节点分配数据
	head->next = second; // 将第一个节点与
	// 第二个节点

	/* 数据已分配到第一个的数据部分
		块(头部指向的块)。 接下来
		第一个块的指针指向第二个。
		所以他们两个是有联系的。

	head		 second		 third
		|			 |			 |
		|			 |			 |
	+---+---+	 +----+----+	 +-----+----+
	| 1 | o----->| # | # |	 | # | # |
	+---+---+	 +----+----+	 +-----+----+	
*/

	// 将数据分配给第二个节点
	second->data = 2;

	// 将第二个节点与第三个节点连接起来
	second->next = third;

	/* 数据已经分配到第二个数据部分
	   块(由秒指向的块)。 接下来
	   第二个块的指针指向第三个
	   堵塞。 所以所有三个块都是链接的。
	
	head		 second		 third
		|			 |			 |
		|			 |			 |
	+---+---+	 +---+---+	 +----+----+
	| 1 | o----->| 2 | o-----> | # | # |
	+---+---+	 +---+---+	 +----+----+	 */

	third->data = 3; // 将数据分配给第三个节点
	third->next = NULL;

	/* 数据已分配到第三个数据部分
	块(由第三个指向的块)。 和下一个指针
	第三块的 NULL 表示
	链表在这里终止。

	我们已经准备好了链表。

		head	
			|
			|
		+---+---+	 +---+---+	 +----+------+
		| 1 | o----->| 2 | o-----> | 3 | NULL |
		+---+---+	 +---+---+	 +----+------+	
	
	
	请注意,只有头部足以表示
	整个列表。 我们可以遍历完整的
	按照下一个指针列出。*/
	return 0;
}

链表遍历

在前面的程序中,我们创建了一个简单的具有三个节点的链表。让我们遍历创建的列表并打印每个节点的数据。对于遍历,让我们编写一个通用函数 printList() 来打印任何给定的列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 一个用于遍历链表的简单 C++ 程序
#include <bits/stdc++.h>
using namespace std;

class Node {
public:
	int data;
	Node* next;
};

// 此函数打印链表的内容
// 从给定节点开始
void printList(Node* n)
{
	while (n != NULL) {
		cout << n->data << " ";
		n = n->next;
	}
}

// 驱动程序代码
int main()
{
	Node* head = NULL;
	Node* second = NULL;
	Node* third = NULL;

	// 在堆中分配 3 个节点
	head = new Node();
	second = new Node();
	third = new Node();

	head->data = 1; // 在第一个节点分配数据
	head->next = second; // 将第一个节点与第二个节点连接起来

	second->data = 2; // 将数据分配给第二个节点
	second->next = third;

	third->data = 3; // 将数据分配给第三个节点
	third->next = NULL;

	printList(head);

	return 0;
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 2 3

联系作者

我已经写了很长一段时间的技术博客,并且主要通过CSDN发布,这是我的一篇技术文章/教程。希望你们会喜欢!更多相关文章及我的联系方式我放在这里:

https://github.com/wanghao221 https://gitee.com/haiyongcsdn/haiyong

如果你真的从这篇文章中学到了一些新东西,喜欢它,收藏它并与你的小伙伴分享。🤗最后,不要忘了❤或📑支持一下哦

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构|实现一个链表[4]
如上面的代码,就是构建了链表在内存中的存储结构,int data是需要存储的int数据。struct JD *prior则是定义指向前面一个链表结构体的指针。struct JD *next同理是指向下一个链表结构体的指针。所以这个链表的结构共计三个部分,记录数据,指向下一个链表块,指向上一个链表块。 那么怎么实现链表的创建呢。首先我们定义一个当前选中的链表结构体,作为head。第一个元素的时候,需要我们自己把两个指针各自指向自己,记录数据也需要手动填充。 之后则是开辟新的空间,添加下一个链表块。
福贵
2020/05/29
3420
小白学算法-数据结构和算法教程: 反转链表
给定一个指向链表头节点的指针,任务是反转链表。我们需要通过更改节点之间的链接来反转列表。
用户1418987
2023/10/26
2150
小白学算法-数据结构和算法教程: 反转链表
java入门之数据结构详细介绍以及代码示例
数据结构是计算机科学中的一个重要概念,它是指在计算机中存储和组织数据的方式。在Java中,数据结构可以通过类和接口来实现。本文将介绍Java中常见的数据结构,包括数组、链表、栈、队列、二叉树、哈希表等,并提供相应的代码示例。
疯狂的KK
2023/03/20
5840
[数据结构]C语言链表实现
我学数据结构的时候也是感觉很困难,当我学完后我发现了之所以困难时因为我没有系统的进行学习,而且很多教授都只是注重数据结构思想,而忽略了代码方面,为此我写了这些博文给那些试图自学数据结构的朋友,希望你们少走弯路
racaljk
2018/08/31
5.7K0
[数据结构]C语言链表实现
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
队列提供了一种有效的方式来管理和处理需要按照特定顺序执行的任务或数据项。通过使用队列,可以确保数据项按照它们被接收或生成的顺序进行处理,这是许多应用中非常关键的要求。
倔强的石头_
2024/12/06
2050
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
【数据结构】单链表的增删改查
单链表需要使用的函数指针操作小技巧计算单链表的长度创建单链表单链表插入数据单链表删除数据效率分析
程序员周同学
2019/07/27
1.7K0
数据结构之链表
数据结构是一种分析、存储、组织数据的方法与逻辑,它考虑了数据之间的特性与相互关系,简单地说,数据结构就是对数据与算法的研究。数据结构分为8类有:数组、栈、队列、链表、树、散列表、堆、图。
MeteoAI
2019/09/24
5760
数据结构--单链表single linked list数据结构C++实现
2018年2月开始学习的 C++ Primer,到今天2019年3月已经整整一年了,非常感谢在一起交流的小伙伴,是你们的无私帮助和分享使得我能跨越很多技术的坑,感谢你们!期待我们2019年一起拿下《数据结构与算法》以及Python入门。
Michael阿明
2021/02/20
5050
数据结构--单链表single linked list数据结构C++实现
【初阶数据结构】链表的柔光之美
链表(Linked List)通过动态内存分配和指针连接完美解决了这些问题。每个元素(节点)包含:
用户11456817
2025/02/26
900
【初阶数据结构】链表的柔光之美
数据结构于算法—线性表详解(顺序表、链表)
下面用一个图来浅析线性表的关系。可能有些不太确切,但是其中可以参考,并且后面也会根据这个图举例。
bigsai
2019/09/24
6280
数据结构于算法—线性表详解(顺序表、链表)
【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念
1.1 LinkedList 简介 LinkedList 是 Java 集合框架中的一个类,它实现了 List、Deque 和 Queue 接口,底层基于双向链表实现。 LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引⽤将节点连接起来了,因此在在任意位置插⼊或者删除元素时,不需要搬移元素,效率⽐较⾼。
学无止尽5
2025/05/31
1820
【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念
小朋友学数据结构1:链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
海天一树
2019/05/05
4410
小朋友学数据结构1:链表
史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)
  链表,别名链式存储结构或单链表,用于存储逻辑关系为 “一对一” 的数据。链表中每个数据的存储都由以下两部分组成:   1.数据元素本身,其所在的区域称为数据域。   2.指向直接后继元素的指针,所在的区域称为指针域。
嵌入式与Linux那些事
2021/05/20
1.7K0
史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)
【数据结构】----链表--双向链表
双向链表每个元素都是一个对象,每个对象包括一个数据域和两个指针域next和prev。
Skrrapper
2024/06/18
1050
【数据结构】----链表--双向链表
Leetcode链表题目总结
  最近刷了一些链表相关的题目,总结了下比较经典的题目。在leetcode中,官方给出的说明是malloc的内存不需要释放,所以代码中都没有free。但是在实际的编程中,我们要将申请的内存释放掉,同时把指针指向NULL,这是一种良好的习惯。
嵌入式与Linux那些事
2021/05/20
5980
Leetcode链表题目总结
数据结构学习笔记|链表
链表是一种常见的数据结构,一般的缓存管理都会选择链表来实现LRU。在常见的面试八股文中,总会提到数组和链表的区别。一般的答案主要包括几个方面:
有财君
2023/06/02
2900
数据结构学习笔记|链表
【愚公系列】2023年11月 数据结构(二)-链表
数据结构是计算机科学中的一个重要概念,它描述了数据之间的组织方式和关系,以及对这些数据的访问和操作。常见的数据结构有:数组、链表、栈、队列、哈希表、树、堆和图。
愚公搬代码
2023/11/01
3560
数据结构---单向链表
如果我频繁的在头部或中间插入数据,此时选择链表。但频繁使用下标操作时,就选择数组。
用户4793865
2023/01/12
6910
数据结构---单向链表
数据结构Java实现:单链表
对一名程序猿来讲,使用哪种语言来开发程序不是最重要的,数据结构和算法才是核心,是程序猿的内功,最终决定你的技术上限。如果你想拔高自己的水平,提高核心竞争力,数据结构和算法是必须要学的,今天就带大家一起来学习链表的概念,并用 Java 语言实现一个链表的结构。
南风
2019/05/31
1.2K0
数据结构Java实现:单链表
【C语言】深入浅出:C语言链表的全面解析
链表是一种常见的数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的最大特点是节点在内存中不必连续存储,因而在插入和删除操作时更加高效。下面我们将详细讲解C语言中单链表、双向链表和循环链表的基本概念、实现方法及其相关操作。
LuckiBit
2024/12/11
7360
相关推荐
数据结构|实现一个链表[4]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验