算法高频面试题4:链表操作相关的面试题

力扣高频|算法面试题汇总(四):堆、栈与队列 力扣高频|算法面试题汇总(四):堆、栈与队列 力扣链接 目录: 1.最小栈 2.数组中的第K个最大元素 3.数据流的中位数 1.最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 示例: ... 阅读详情

1. 链表属于比较基础的数据结构,看起来简单,实际上写起来并不简单,考察的是面试者的细心。

2. 下面以C++语言实现一个单链表,其中囊括了大部分的单链表面试题。

#include <iostream>
using namespace std;

class MyList {
	struct Node;
public:
	//1. 构造函数,让head的value永远为NULL,head作为哨兵节点
	MyList() {
		head = new Node(NULL);
		head->next = nullptr;
	}

	//2. 需要释放内存,避免内存泄漏。下面提供了两种析构链表的方法,作为对链表的思考试验
	~MyList() {
		////方法一:先删除所有的head->next节点,最后删除head节点
		//if (head) {
		//	while (head->next) {
		//		Node* deleteNode = head->next;
		//		head->next = deleteNode->next;
		//		cout << "删除:" << deleteNode->data << endl;
		//		delete deleteNode;
		//	}
		//	cout << "删除:head" << endl;
		//	delete head;
		//}

		//方法二:从头结点开始删除,依次删除所有节点,也就是每次删除的都是头结点
		while (head) {
			Node* deleteNode = head;
			head = head->next;
			cout << "删除:" << deleteNode->data << endl;
			delete deleteNode;
		}
	}

	//3.在链表的尾部插入节点,从这里可以看出有一个哨兵头结点的好处,那就是不用对头结点做特殊处理
	void push_back(int value) {
		Node* tmp = head;
		//找到尾部
		while (tmp->next != nullptr) {
			tmp = tmp->next;
		}
		Node* insertNode = new Node(value);
		tmp->next = insertNode;
	}


	//4. 每次都在链表的头部插入节点,即每次在head之后进行插入
	void push_front(int value) {
		Node* insertNode = new Node(value);
		insertNode->next = head->next;
		head->next = insertNode;
	}

	//5. 在链表的指定位置插入节点,例如原链表为1,2,3,4,在第2个位置后插入6,变为1,2,6,3,4
	void insertNode(int index, int value) {
		Node* insertNode = new Node(value);
		Node* tmp = head;
		for (int i = 0; i < index; i++) {
			tmp = tmp->next;
		}
		insertNode->next = tmp->next;
		tmp->next = insertNode;
	}

	//6. 删除指定位置的节点
	void deleteNode(int index) {
		Node* tmp = head;
		Node* prev = head;
		for (int i = 0; i < index; i++) {
			prev = tmp;
			tmp = tmp->next;
		}
		prev->next = tmp->next;
		delete tmp;
	}

	//7. 删除链表中倒数第N个节点,查找倒数第N个节点同理
	void deleteNode2(int index) {
		Node* firstNode = head;
		Node* secondeNode = head;
		Node* prev = head;
		for (int i = 0; i < index; i++) {
			firstNode = firstNode->next;
		}
		while (firstNode) {
			prev = secondeNode;
			firstNode = firstNode->next;
			secondeNode = secondeNode->next;
		}
		prev->next = secondeNode->next;
		delete secondeNode;
	}

	//6. 链表的反转
	void reverseList() {
		Node* cur = head->next;
		Node* prev = nullptr;
		Node* next = cur;

		while (cur) {
			if (!cur->next) {
				head->next = cur;
			}
			next = cur->next;
			cur->next = prev;
			prev = cur;
			cur = next;
		}
	}

	//7. 链表中环的检测,以及环的入口,还需要仔细思考下,本体考察快慢指针
	bool checkCircle() {
		Node* fast = head;
		Node* slow = head;
		Node* crossPoint = nullptr;
		Node* entry = nullptr;

		while (fast->next) {
			if (fast == slow) {
				crossPoint = slow;
				fast = head;
				while (fast) {
					if (fast == slow) {
						entry = fast;
						return true;
					}
					fast = fast->next;
					slow = slow->next;
				}
			}
			fast = fast->next->next;
			slow = slow->next;
		}
		return false;
	}

	//8. 两个有序链表的合并
	void merge(MyList* list);

	//9. 求链表的中间节点,本题的解法明显是对快慢指针的考察,快节点每次走两步,
	//慢节点每次走一步,那么慢节点就是我们的中间节点,同理求数组的中间节点
	//需要注意的是,需要注意各种判断条件,链表考察的就是细心
	int midle() {
		Node* fast = head;
		Node* slow = head;		
		while (fast) {
			if (fast->next) {
				fast = fast->next->next;
			}
			else {
				break;
			}
			slow = slow->next;
		}
		return slow->data;
	}

	//10. 打印链表
	void show() {
		Node* loop = head->next;
		while (loop) {
			cout << loop->data << endl;
			loop = loop->next;
		}
	}

private:
	struct Node
	{
		int data;
		Node* next;
		Node(int val):data(val),next(nullptr){}
	};

private:
	//链表头,注意头结点的值永远为空,目的是方便链表的操作
	Node* head;
};



int main() {
	MyList* list = new MyList();
	list->push_back(10);
	list->push_back(20);
	list->push_back(30);
	list->push_back(40);
	//list->push_back(50);
	list->show();
	int mid = list->midle();
	cout << "mid:" << mid << endl;
	//list->reverseList();
	//list->insertNode(2, 25);
	//list->deleteNode(3);
	//list->deleteNode2(2);
	//list->push_front(9);
	//list->push_front(8);

	list->show();

	delete list;
	return 0;
}

 

链表算法精解:从基础操作到面试高频题 链表是计算机科学中的基础数据结构,通过指针连接非连续内存节点,在动态内存分配场景中具有独特优势。其核心操作包括遍历、节点增删和指针修改,这些基础操作构成了解决复杂算法问题的基石。在实际工程中,链表广泛应用于内存管理、文件系统和LRU缓存等场景。针对技术面试中的高频考点,本文深入解析虚拟头节点、快慢指针等经典技巧,通过LeetCode真题如反转链表、环形链表检测等案例,展示如何运用递归和迭代两种思维模式解决问题。特别针对203题移除元素、206题反转链表等高频面试题,提供可落地的Python实现方案和边界条件 阅读详情

相关推荐

互联网大厂高频面试题基本总结回顾(含笔试高频算法整理)

1.自我介绍+项目介绍+项目细节/难点提问-------这个主要看个人的经历了,每个人都不一样 2.基础知识点考核---------还是可以去增强自己的,也是这次的主要的一些总结思路 3.算法题-----------一般都是LeetCode高频题,这个得在找工作之前的好好的练习(d对常见的高频题进行总结分析,见对应的链接提示)

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 177万+

查找不含有重复字符的最长子串的长度

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 public static int lengthOfLongestSubstring(String s) { int rs = 0; int[] last = new int[128]; for (int i = 0; i < 128; i++) { last[i] = -1; } int start = 0; for

weixin_44783458的博客 592

大厂算法面试题库中高频出现的30道典型题

大厂算法面试题库中,高频出现的30道典型题

《算法面试必刷:15 个高频 LeetCode 题(附代码)》

以上15个高频 LeetCode 题覆盖了数组、链表、字符串、树、动态规划、回溯等核心算法主题。掌握这些题能显著提升算法面试成功率。理解每个题的解题思路,避免死记硬背。在 LeetCode 平台实践,测试边界条件。扩展学习类似题目,如“四数之和”或“子集问题”。如果您有具体题目或细节疑问,欢迎随时提问!

2501_93877981的博客 1761

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3173

帕德伯恩大学轴承数据集(PU)介绍

PU数据集介绍一、帕德伯恩大学轴承数据集故障类别说明二、关于损伤描述2.1 损伤组合:2.2 重复和多重损伤的安排:2.3 几何尺寸2.4 损伤程度2.5损伤特征数据集损伤类别三、人为损坏轴承3.1 最常用的人为损伤制造方法是:3.2 本数据集使用的人工损坏是由三种不同方法引起的四、通过加速寿命试验产生真正的轴承损坏样本 一、帕德伯恩大学轴承数据集 数据集下载地址 从帕德伯恩大学获得的PU数据集是一个6203轴承数据集,包括人为诱发的和真实的损害。采用压电加速度计采集轴承座的振动信号,采样频率为64 kHz

m0_47180208的博客 3万+

7 道高频面试算法题,你都会了吗?「矩阵 + 位运算 + LRU」

矩阵 螺旋矩阵 给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素。 public List<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> rst = new ArrayList<Integer>(); if(matrix...

圆号本号 1533

STM32铅酸蓄电池内阻测试仪的交流阻抗测量与数据采集优化

本文深入探讨了基于STM32的铅酸蓄电池内阻测试仪设计,重点解析了交流阻抗测量原理与数据采集优化方案。通过采用1kHz交流小信号注入和数字相敏检波技术,实现对电池欧姆内阻的无损精准测量,并详细介绍了硬件前端调理、ADC过采样及系统标定等关键优化手段,有效提升了测量精度与稳定性。

weixin_29168393的博客 487

【分类整理】面试最常考的 100 道 LeetCode 算法题

100道面试常考的力扣算法题,经过众多面试者投票选出来的,快来领取!

负雪明烛 3万+

学Simulink--基础储能管理场景实例:基于Simulink的储能SOC均衡控制策略仿真

本文完成了基于 Simulink 的储能 SOC 均衡控制策略仿真,实现了:✅掌握并联系统 SOC 分化机理✅构建基于电流重分配的主动均衡架构✅验证均衡对系统可用容量的显著提升✅实现 SOC 偏差 < 2% 的高精度控制。

amy_mhd的博客 85

Qt for WebAssembly环境搭建

一、前言 二、Ubuntu 1、在线安装Qt15 在线安装下载器:https://download.qt.io/official_releases/online_installers/ 安装时记得勾选WebAssembly,如下: 2、安装依赖 # Install Python sudo apt-get install python2.7 # Install CMake (optional, only needed for tests and building Binaryen) sudo apt

贝勒里恩的博客 3670

数据结构与算法 - 数据结构面试高频考点:数组与链表的核心问题

数据结构与算法:数组与链表核心要点总结 数组(静态结构) 特点:连续内存、O(1)随机访问、固定大小 操作复杂度: 访问:O(1) 插入/删除:O(n)(需移动元素) 典型问题: 两数之和(暴力/哈希表优化) 最大子数组和(动态规划) 链表(动态结构) 特点:非连续内存、动态扩展、指针连接 操作复杂度: 访问:O(n) 插入/删除:O(1)(已知位置时) 典型问题: 反转链表(迭代/递归) 环形链表检测(快慢指针) 对比 数组优势:随机访问快、缓存友好 链表优势:动态扩容、插入删除高效 (注:实际实现代码请

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

ESP32-C3入门教程 环境篇②——Windows开发环境准备

文章目录一、注意事项二、下载ESP-IDF工具安装器三、安装内容四、详细安装步骤报错处理 一、注意事项 请注意 ESP-IDF 和 ESP-IDF 工具的安装路径不能超过 90 个字符,安装路径过长可能会导致构建失败。 Python 或 ESP-IDF 的安装路径中一定不能包含空格或括号。 除非操作系统配置为支持 Unicode UTF-8,否则 Python 或 ESP-IDF 的安装路径中也不能包括特殊字符(非 ASCII 码字符、中文字符) 二、下载ESP-IDF工具安装器 ESP-IDF Win

5245

对于单链表相关经典算法题:21. 合并两个有序链表及面试题 02.04. 分割链表的解析

本文深入解析了单链表的两个经典问题:有序链表合并与链表分割。对于合并两个有序链表,文章详细介绍了两种解法:常规方法和哨兵节点法,重点阐述了哨兵节点如何简化边界处理。针对分割链表问题,提出双链表分类法,强调节点分类与拼接逻辑,特别指出拼接后需处理尾指针以避免链表成环。文章通过代码示例和详细注释,展示了指针操作的技巧,并分析了常见错误原因。最后总结链表问题训练的核心能力——逻辑连贯性和边界处理,强调这些基础技能对解决更复杂算法问题的重要性。

2503_92929084的博客 3778

Kimi Code国产AI编程助手安装使用详细教程

Kimi Code 开发者智能编程服务简介:Kimi Code 是专为开发者提供的 AI 编程辅助工具,基于旗舰模型 Kimi K3(2.8万亿参数,支持100万token上下文)。提供 CLI、VS Code 插件等形式,支持代码阅读、编辑等功能。用户可通过API Key接入第三方工具。安装简单(Windows/Mac/Linux一键脚本),需在官网生成API密钥并登录使用。注意账户需充值余额方可正常调用服务。

猿小白的博客 2068

提示工程架构师揭秘:prompt优化中的“隐性成本”如何控制?

当我们谈论Prompt优化时,往往聚焦于“效果提升”——比如让模型生成更准确的回答、更符合要求的格式。优化的本质是“成本-收益”的平衡。那些看不见的“隐性成本”,比如反复调试的时间消耗、复杂Prompt带来的认知负荷、长文本导致的系统资源浪费、后续维护的无穷麻烦,往往会在长期运营中成为压垮效率的“稻草”。本文将从提示工程架构师的视角,揭秘Prompt优化中的“隐性成本”到底是什么、如何量化,以及通过哪些工程化手段将这些“看不见的消耗”转化为“可控制的效率”。

操作系统内核探秘的博客 700

掌握链表面试核心:从基本操作到高频考题全解析!

想在面试中征服链表?这份指南不可错过!本文深入剖析了四道高频链表面试题,从基础的合并与分区,到复杂的约瑟夫环和随机指针复制。我们将手把手带你解构难题,让你彻底告别指针混乱,轻松掌握链表精髓。

persevereX的博客 1331

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大厂高频经典面试题-《链表合集》

本文深入剖析链表相关的面试题,收集的都是互联网大厂高频问到的题库。

849

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

6.面试算法-链表之高频面试题(一)

这是一道经典的链表问题先看一下题目。输入两个链表,找出它们的第一个公共节点。例如下面的两个链表:两个链表的头结点都是已知的,相交之后成为一个单链表,但是相交的位置未知,并且相交之前的结点数也是未知的,请设计算法找到两个链表的合并点。这种问题该怎么入手呢?如果一时想不到该怎么办呢?其实这时候我们可以将常用数据结构和常用算法都想一遍,看看哪些能解决问题。常用的数据结构有数组、链表、队、栈、Hash 、集合、树、堆。常用的算法思想有查找、排序、双指针、递归、迭代、分治、贪心、回溯和动态规划等等。

weixin_36401695的博客 1255

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

别找了,链表和二叉树相关面试题以及解答,我都给你们找好了

无论是在面试还是在平时的做题中,链表相关算法题以及二叉树相关算法题,可以说是考的非常非常多的。我在 2019 的秋招面试中,也是遇到了好几次。为此,我总结了 9 道最高频的链表相关面试题以及 8 道二叉树相关面试题,并且每道题都给出详细的解答,如果你把这些链表题都搞懂了,那么我相信你在链表方面,是没有太大问题的了,二叉树也是。为了大家方便定位,这里先给出大概的提纲: 1、【链表问题】如何优雅着反转...

帅地 3096

链表高频面试题(算法村第一关白银挑战)

长链表的指针比短链表的指针先走|len1 - len2|步,然后同步移动,指向同一结点时返回答案。虽然这么做简单易懂,但面试手撕算法题时不推荐,因为会被视为逃避链表,失去了考验价值。新链表是通过拼接给定的两个链表的所有节点组成的。删除原始链表中所有重复数字的节点,只留下不同的数字。,请你判断该链表是否为回文链表。,旋转链表,将链表每个节点向右移动。,请你找出并返回链表的中间结点。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。,函数返回结果后,链表必须。请你返回结果链表的头指针。

cjj2543107638的博客 1178

数据结构相关的高频面试题-解析步骤

另一种方法是使用一个栈,压入节点时先压入根节点,然后压入右子节点,再压入左子节点,但每个节点压入栈时附带一个标记,表示是否已经处理过子节点。在enqueue元素时,将新元素与双端队列尾部的元素对应的值比较,如果新元素更大,则将尾部元素弹出,直到双端队列为空或者尾部元素对应的值大于等于新元素,然后将新元素的索引入队。从根节点开始,如果根节点是其中一个目标节点,则返回根节点;如果尾节点相同,说明相交,然后通过调整较长链表的起始位置,使其与较短链表的长度相同,再同时遍历两个链表,直到找到相同的节点,即为相交点。

坚持写博客,大家的关注是我前进的动力! 813

从内存地址到算法实战:指针操作链表的十大黄金法则(附LeetCode高频题解)

本篇我们深入学习了链表这种重要的非连续存储数据结构。我们了解了单链表和双链表的结构,特别是ListNode的定义和虚拟头结点的妙用。我们还掌握了链表最基本的操作:遍历、查找、插入和删除。最重要的是,我们通过五个经典的面试题目,深入理解了指针的艺术和快慢指针反转链表:掌握迭代法(三指针法)和递归法,这是链表操作的基石。合并两个有序链表:利用虚拟头结点和双指针高效合并。删除链表的倒数第 N 个结点:通过快慢指针精确定位。环形链表:用快慢指针(龟兔赛跑算法)判断环的存在和找出环的入口。链表相交。

HUANGXIN9898的博客 750

链表高频面试题(思路纯享版!!)

链表高频面试题!梳理完后再也不担心链表合并、反转、删除区间啦!

qq_74092815的博客 967

Java-数据结构-链表-高频面试题(1)

你所厌恶的今天,是昨天死去之人奢望的明天。你所浪费的现在,是未来的你回不去的曾经。时间如此宝贵,作为学生,学习就是我们的职责,那么不要懈怠!让我们开始今天的学习吧!

爱是小小的癌的博客 1871

2025高频面试算法总结篇【排序】

2025高频面试算法总结篇——排序

高朗的博客 1194
上一篇: java高频面试题1:volatitle关键字的理解
下一篇: scala编程入门1
我能想到的
博客等级 码龄12年 44粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值