基于链表的基础笔试/面试题

1. 反转链表

问题描述:反转一个单向链表。

示例:

输入:1 → 2 → 3 → 4 → 5

输出:5 → 4 → 3 → 2 → 1

class ListNode {int val;ListNode next;ListNode(int x) {val = x;}
}public class LinkedList {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode nextTemp = curr.next; // 保存下一个节点curr.next = prev;              // 当前节点反转指向前一个节点prev = curr;                   // prev移动到当前节点curr = nextTemp;               // curr移动到下一个节点}return prev; // prev为新的头节点}
}

2. 查找链表中间节点

问题描述:给定一个单链表,找出链表的中间节点。如果链表有两个中间节点,则返回第二个中间节点。

示例:

输入:[1, 2, 3, 4, 5]

输出:3

输入:[1, 2, 3, 4, 5, 6]

输出:4

public class LinkedList {public ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;        // 慢指针每次走一步fast = fast.next.next;   // 快指针每次走两步}return slow;  // 当快指针到达尾部时,慢指针正好在中间}
}

3. 环形链表检测

问题描述:给定一个链表,判断链表是否有环。

示例:

输入:[3, 2, 0, -4],环形链表,从节点2开始有环

输出:true

public class LinkedList {public boolean hasCycle(ListNode head) {if (head == null) return false;ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;        // 慢指针每次走一步fast = fast.next.next;   // 快指针每次走两步if (slow == fast) {      // 快慢指针相遇,表示有环return true;}}return false;  // 没有环}
}

4. 删除链表倒数第N个节点

问题描述:删除链表的倒数第N个节点,并返回链表的头节点。

示例:

输入:[1, 2, 3, 4, 5], N = 2

输出:[1, 2, 3, 5]

public class LinkedList {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode fast = head;ListNode slow = head;// 快指针先走n步for (int i = 0; i < n; i++) {fast = fast.next;}// 如果fast为null,说明要删除的是头节点if (fast == null) {return head.next;}// 快慢指针同时走while (fast != null && fast.next != null) {fast = fast.next;slow = slow.next;}// 删除慢指针的下一个节点slow.next = slow.next.next;return head;}
}

5. 合并两个有序链表

问题描述:将两个升序链表合并为一个新的升序链表,返回合并后的链表。

示例:

输入:1 → 2 → 4, 1 → 3 → 4

输出:1 → 1 → 2 → 3 → 4 → 4

public class LinkedList {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode dummy = new ListNode(0);  // 创建一个虚拟头节点ListNode current = dummy;while (l1 != null && l2 != null) {if (l1.val < l2.val) {current.next = l1;l1 = l1.next;} else {current.next = l2;l2 = l2.next;}current = current.next;}// 将剩余的部分连接上if (l1 != null) {current.next = l1;}if (l2 != null) {current.next = l2;}return dummy.next;  // 返回合并后的链表头}
}

6. 删除链表中的重复元素

问题描述:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例:

输入:1 → 1 → 2 → 3 → 3

输出:1 → 2 → 3

public class LinkedList {public ListNode deleteDuplicates(ListNode head) {ListNode current = head;while (current != null && current.next != null) {if (current.val == current.next.val) {current.next = current.next.next;  // 跳过重复节点} else {current = current.next;  // 继续遍历}}return head;}
}

7. 找到链表的环入口节点

问题描述:给定一个链表,如果链表中有环,找出环的入口节点。如果没有环,返回null。

示例:

输入:3 → 2 → 0 → -4,环形链表,环的入口是节点2

输出:2

public class LinkedList {public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;// 快慢指针检测是否有环while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) {  // 如果快慢指针相遇,说明有环ListNode entry = head;while (entry != slow) {  // 找环的入口entry = entry.next;slow = slow.next;}return entry;  // 返回环的入口节点}}return null;  // 没有环}
}


上述是一些面试中常见问题,还有一部分比较少见但是也会遇上的问题:

  1. 链表的交集:如何找到两个链表的交集?

  2. 链表的差集:如何找到两个链表的差集?

  3. 链表的环形数组:如何判断一个链表是否可以构成环形数组?

  4. 复制带有随机指针的链表:如何复制一个包含随机指针的链表?

  5. 奇偶排序链表:如何对链表进行奇偶排序?

  6. 链表的插入排序:如何使用插入排序算法对链表进行排序?

  7. 链表的递归遍历:如何使用递归方法遍历链表?

  8. 链表的扁平化:如何将一个嵌套的链表扁平化?

  9. 链表的旋转:如何将链表向右旋转k个位置?

  10. 链表的重新排列:如何将链表中的节点重新排列,使得奇数索引的节点和偶数索引的节点交替出现?

  11. 链表的分组:如何将链表中的节点分成k个大小相等的组?

  12. 链表的压缩:如何压缩链表,使得所有值为val的节点合并为一个节点?

可以试着实现这些笔试题,在面试时更有自信!!!

不积跬步,无以至千里 --- xiaokai

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

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

相关文章

[高等数学学习记录] 泰勒公式

1 知识点 1.1 要求 为简化计算, 通常用多项式近似表达复杂函数: 设函数 f ( x ) f(x) f(x) 在含有 x 0 x_0 x0​ 的开区间内具有 ( n 1 ) (n1) (n1) 阶导数, 试找出一个关于 ( x − x 0 ) (x-x_0) (x−x0​) 的 n n n 次多项式 p n ( x ) p_n(x) pn​(x) 近似表达 f…

Linux条件变量线程池详解

一、条件变量 【互斥量】解决了线程间同步的问题&#xff0c;避免了多线程对同一块临界资源访问产生的冲突&#xff0c;但同一时刻对临界资源的访问&#xff0c;不论是生产者还是消费者&#xff0c;都需要竞争互斥锁&#xff0c;由此也带来了竞争的问题。即生产者和消费者、消费…

【错误记录】jupyter notebook打开后服务器错误Forbidden问题

如题&#xff0c;在Anaconda Prompt里输入jupyter notebook后可以打开浏览器&#xff0c;但打开具体项目后就会显示“服务器错误&#xff1a;Forbidden”&#xff0c;终端出现&#xff1a; tornado.web.HTTPError: HTTP 403: Forbidden 查看jupyter-server和jupyter notebook版…

shodan2-批量查找CVE-2019-0708漏洞

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

PostgreSQL实现透视表查询

PostgreSQL 8.3版本发布时&#xff0c;引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数&#xff0c;用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载&#xff0c;已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd&#xff0c;键入rustc --version&#xff0c;出现 rust 版本号&…

【掩体计划——DFS+缩点】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e5 10; vector<vector<int>> g; bool st[N]; int ans 1e9; bool dfs(int f, int u, int dis) {bool is 1;for (auto j : g[u]){if (j f)continue;is & dfs(u, j, dis (g[u].…

第四十四篇 EfficientNetV1、V2模型详解

摘要 EfficientNetV1 详解 简要介绍 EfficientNet是Google提出的一种高效的神经网络架构,其核心思想是通过比例缩放网络的宽度(通道数)、高度和深度(层数)来平衡计算资源和准确性。EfficientNetV1是该系列的首个版本,在提出时便在效果、参数量、速度方面均大幅超越了之…

微信小程序踩坑指南(二)<template>和<block>

<template> 小程序里的和Vue里的表达的不是一种含义。小程序的template是一种模板&#xff0c;不能用于直接显示代码。它正常情况下不显示&#xff0c;需加载使用。 <block> 并不是一个组件&#xff0c;它仅仅是一个包装元素&#xff0c;不会在页面中做任何渲染…

【Spring】注解开发

为了提高开发效率&#xff0c;从 Spring 2.0 开始引入了多种注解&#xff0c;而在 Spring 3.0 中则实现了纯注解的开发方式。 一、注解的使用 在 Spring 2.0 之后&#xff0c;使用注解进行开发主要分为两个步骤&#xff1a; 定义 Bean&#xff1a;使用 Component 注解来定义…

【Linux】vim编辑器练习

1.在/tmp目录下建立一个名为mytest的目录&#xff0c;进入mytest目录 (1)进入/tmp目录 cd /tmp &#xff08;2&#xff09;创建mytest目录 mkdir mytest &#xff08;3&#xff09;查看是否创建成功 ls 或 ls -l &#xff08;4&#xff09;进入mytest目录 cd mytest …

游戏引擎学习第25天

Git: https://gitee.com/mrxiao_com/2d_game 今天的计划 总结和复述&#xff1a; 这段时间的工作已经接近尾声&#xff0c;虽然每次编程的时间只有一个小时&#xff0c;但每一天的进展都带来不少收获。尽管看起来似乎花费了很多时间&#xff0c;实际上这些日积月累的时间并未…

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…

深入探讨锁升级问题

1. 引言 本文深入探讨锁升级问题。 2. 锁升级问题概述 2.1 锁升级的概念 2.1.1 定义 锁升级是指数据库管理系统将较低粒度的锁&#xff08;如行级锁&#xff09;转换为较高粒度的锁&#xff08;如表级锁&#xff09;的过程。这种情况通常发生在事务对同一对象的多个较低粒…

推荐几个可以免费下载网站模板的资源站

推荐几个可以免费下载网站模板的资源站&#xff0c;上面有免费的wordpress模板和帝国CMS模板可以下载。 模板帝 Mobandi.com 模板帝是一个提供丰富网站模板资源的平台&#xff0c;旨在帮助用户快速构建和美化自己的网站。无论是个人博客、企业官网还是电子商务平台&#xff…

设计模式 更新ing

设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件&#xff0c;区分不同的用户级别 包括访客&#xff0…

c++预编译头文件

文章目录 c预编译头文件1.使用g编译预编译头文件2.使用visual studio进行预编译头文件2.1visual studio如何设置输出预处理文件&#xff08;.i文件&#xff09;2.2visual studio 如何设置预编译&#xff08;初始创建空项目的情况下&#xff09;2.3 visual studio打开输出编译时…

SeggisV1.0 遥感影像分割软件【源代码】讲解

在此基础上进行二次开发&#xff0c;开发自己的软件&#xff0c;例如&#xff1a;【1】无人机及个人私有影像识别【2】离线使用【3】变化监测模型集成【4】个人私有分割模型集成等等&#xff0c;不管是您用来个人学习还是公司研发需求&#xff0c;都相当合适&#xff0c;包您满…

echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip

一.地图立体效果 方法1:两层地图叠加 实现原理:geo数组中放入两个地图对象,通过修改zlevel属性以及top,left,right,bottom形成视觉差 配置项参考如下代码: geo: [{zlevel: 2,top: 96,map: map,itemStyle: {color: #091A51ee,opacity: 1,borderWidth: 2,borderColor: #16BAFA…

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…