首页 > 其他分享 >链表理论部分

链表理论部分

时间:2023-10-23 22:34:18浏览次数:35  
标签:ListNode val 理论 链表 内存 部分 节点 指针

链表理论部分

什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针)、最后一个节点的指针域指向null(空指针的意思)。

链表的入口节点称为链表的头结点也就是head。

如图所示:

image-20231023214927316

链表的类型

接下来说一下链表的几种类型:

单链表

刚刚说的就是单链表。

双链表

单链表中的指针域只能指向节点的下一个节点。

双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表既可以向前查询也可以向后查询。

如图所示:

image-20231023215432999

循环链表

循环链表,顾名思义,就是链表首尾相连。循环链表可以用来解决约瑟夫环的问题。

image-20231023215544546

链表的存储方式

了解完链表的类型,再来说一说链表在内存中的存储方式。

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。

链表是通过指针域的指针链接在内存中各个节点。

所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。

如图所示:

image-20231023215704453

这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。

链表的定义

typedef struct ListNode {
	ElementType data;
	struct ListNode *next;
}ListNode, *LinkList;

链表的操作

删除节点

删除D节点,如图所示:

image-20231023220048561

只要将C节点的next指针指向E节点就可以了。

那有同学说了,D节点不是依然存留在内存里么?只不过是没有在这个链表里而已。

是这样的,所以在C++里最好是再手动释放这个D节点,释放这块内存。

其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。

添加节点

如图所示:

image-20231023220144932

可以看出链表的增添和删除都是O(1)操作,也不会影响到其他节点。

但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。

性能分析

再把链表的特性和数组的特性进行一个对比,如图所示:

image-20231023220222295

数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。

链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

public class ListNode {
	//节点的值
	int val;
	
	//下一个节点
	ListNode next;
	
	//节点的构造函数(无参)
	public ListNode() {
	
	}
	
	// 节点的构造函数(有一个参数)
	public ListNode(int val) {
		this.val = val;
	}
	
	// 节点的构造函数(有两个参数)
	public ListNode(int val, ListNode next) {
	this.val = val;
	this.next = next;
	}
}

标签:ListNode,val,理论,链表,内存,部分,节点,指针
From: https://www.cnblogs.com/codingbao/p/17783653.html

相关文章

  • 01_移除链表元素
    移除链表元素题意:删除链表中等于给定值val的所有节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],val=7输出:[]203.移除链表元素实现代码如下:(本代码是通过带头节点的单链表来实现......
  • LeetCode | 19. 删除链表的倒数第 N 个结点
    1相关标签链表、双指针、C语言2报错情况2.1题目给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。2.2错误代码/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNo......
  • 根据以往面经,计网部分很少有相关知识的深刻问题,主要问题集中在TCP的三次握手和四次挥
    SYN(Synchronize)和ACK(Acknowledge)是TCP协议中用于连接建立和数据传输的两个非常重要的标志位。建立一个TCP连接需要“三次握手”,缺一不可:一次握手:client客户端发送带有SYN(SEQ=x)标志的数据包->服务端,然后客户端进入SYN_SEND状态,等待服务器的确认;发起方:客户端描述......
  • Pandas在合并数据的时候,发现部分数据缺失,该怎么解决?
    大家好,我是皮皮。一、前言前几天在Python最强王者群【wen】问了一个Pandas数据合并的问题,一起来看看吧。请教:对两个exlce表示进行合并,df=pd.merge(df1,df2,on="用户账号",how='left'),但是由于系统数据的原因,df1表格的“用户账户”缺少最后两位数,而df2中的“用户账户”是准确的,通过......
  • 编程导航算法通关村第 1 关 | 链表
    1.前置知识补充内容引用:https://www.hello-algo.com/数据结构数据结构如同一副稳固而多样的框架。它为数据的有序组织提供了蓝图,使算法得以在此基础上生动起来。分类1.根据逻辑类型分类逻辑结构揭示了数据元素之间的逻辑关系。在数组和链表中,数据按照顺序依次排列,体现......
  • 面试必刷TOP101:9、删除链表的倒数第n个节点
    一、题目二、题解2.1双指针由于我们需要找到倒数第n个节点,因此可以使用两个指针fast和slow同时对链表进行遍历,并且fast比slow超前n个节点。当fast遍历到链表的末尾时,slow就恰好处于倒数第n个节点。具体地,初始时fast和slow均指向头节点。首先使用fast对链表......
  • 链表、栈的基本操作
    栈的基本操作#include<iostream>usingnamespacestd;#defineOK1#defineERROR0#defineMaxSize100typedefintElemType;//定义栈_顺序栈structStack{ ElemType*top; ElemType*base; intstacksize;};intIsFull(Stacks);intIsEmpty(Stacks);//初始化in......
  • 面试必刷TOP101:8、链表中倒数最后k个结点
    一、题目输入一个长度为n的链表,设链表中的元素的值为ai ,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为0的链表。二、题解2.1快慢指针第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指......
  • umich cv-4-1 卷积网络基本组成部分介绍
    这节课中介绍了卷积网络的基本组成部分(全连接层,激活函数,卷积层,池化层,标准化等),下节课讨论了卷积神经网络的发展历史以及几种经典结构是如何构建的卷积网络组成部分前言卷积层池化层normalization前言在之前提到的全连接神经网络中,我们直接把一个比如说32*32*3的......
  • 操作系统之部分知识点总结
    1、计算机在一个指令周期的过程中,为从内存读取指令操作码,首先要将程序计数器的内容送到地址总线上;2、当有进程运行时,其他进程访问信号量,信号量就会执行-1操作;3、各种周期时钟周期--也称为震荡周期,定义为时钟脉冲的倒数,是计算机中最基本、最小的时间单位;指令周期--是执行一条指......