单链表OJ题

单链表OJ题(文字解读 + 图解)

  • 1. 移除链表元素
  • 2. 反转链表
  • 3. 链表的中间结点
  • 4. 返回倒数第 k 个节点
  • 5. 合并两个有序链表

1. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
OJ链接=>

struct ListNode* removeElements(struct ListNode* head, int val)

这题当然可以暴力遍历,将值一一对比,相等的删除,并重新链接。但还有更优的思路:

  1. 定义两个指针(slow,fast);
  2. fast先走,如果fast指向的val和其相等,则让slow指向fast的下一个后fast再走;如果不相等,则让slow指向fast指向的位置后发射台再走;
  3. 最后再分一些特殊情况。
    图解
struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* slow = head;struct ListNode* fast = head;//头为空,直接返回空if(head == NULL)return  NULL;while(fast){if(fast->val == val){slow->next = fast->next;fast = fast->next;}else{slow=fast;fast=fast->next;}} //当头结点就是val时并且头结点下一个结点为空,直接返回空if(head->val == val&&head->next==NULL)return NULL;//当头结点就是val时并且头结点下一个结点不去为空,直接返回头节点的下一个节点else if(head->val == val&&head->next!=NULL)return head->next;else return head;
}

最后一定要分情况,不然OJ有些测试用例通过不了。

2. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
OJ链接=>

struct ListNode* reverseList(struct ListNode* head)

这题的最优解:

  1. 创建3个指针,第一个指针n1指向空,第二个指针n2指向头节点,第三个指针n3指向头节点的下一个节点;
  2. 先将n2指向n1,再让n1指向n2,n2指向n3,再循环往后走;

图解

struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1 = NULL;struct ListNode* n2 = head;while(n2){struct ListNode* n3 = n2->next;n2->next = n1;n1 = n2;n2 = n3;}return n1;
}

最后一次,当n3赋值给n2时,n2指向空,所以循环结束条件n2!=NULL。如果将n3放在循环外创建可能会造成空指针,因为数组可能只有一个元素或者就没有元素,这样n3就没有用了。

3. 链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。
OJ链接=>

struct ListNode* middleNode(struct ListNode* head)

这题还是快慢指针问题:
让一个指针从头节点开始一次走一步,让第二个指针从头节点开始一次走两步,走到尾时,慢指针刚好走到中间节点。
图解

struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;}return slow;
}

当节点个数为奇数个时,循环终止条件为fast->next != NULL;当节点个数为偶时,循环终止条件为fast != NULL,将两种情况合并。

4. 返回倒数第 k 个节点

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
OJ链接=>

int kthToLast(struct ListNode* head, int k)

这是一道经典的面试题,最优思路为:先让一个指针从头节点走k步,再让一个指针从头节点开始和前一个指针同时走,当走到尾,慢指针指向的就是我们要的。
在这里插入图片描述

int kthToLast(struct ListNode* head, int k){struct ListNode* slow = head;struct ListNode* fast = head;while(k--){fast = fast->next;}while(fast){fast = fast->next;slow = slow->next;}return slow->val;
}

循环结束条件为当fast == NULL.

5. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
OJ链接=>

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2);

解题思路:
此题可以先创建一个空链表,然后依次从两个有序链表中选取最小的进行尾插操作进行合并。
在这里插入图片描述

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {struct ListNode* head = NULL,*tail = NULL;//特殊情况先出if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}while(list1 && list2){if(list1->val < list2->val){//第一次插入if(tail == NULL){head = tail = list1;}else{//后续取较小的尾插tail->next = list1;tail = tail->next; }list1 = list1->next;}else{if(tail == NULL){head = tail = list2;}else{tail->next = list2;tail = tail->next; }list2 = list2->next;}}//当list2走完,list1还有节点时直接尾插if(list1){tail->next = list1;}//当list1走完,list2还有节点时直接尾插if(list2){tail->next = list2;}return head;
}

单链表没有这么简单,目前程度我做不来难题,后续有机会再更新.

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

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

相关文章

第六节:使用SMB开发WebService

一、概述 webservice在日常开发中是常用的接口形式&#xff0c;SMB在设计之初就将webservice作为重要的代理协议。在组件库中提供了webservice input和webservice output两个组件&#xff0c;分别用于发布接口和调用接口。 二、发布webservice 在csdnProject工程中创建名为c…

【设计模式】-工厂模式

工厂模式是一种创建型设计模式&#xff0c;它提供了一种在不指定具体类的情况下创建对象的方法。工厂模式的核心思想是将对象的创建与使用分离&#xff0c;降低系统的耦合度&#xff0c;使系统更加灵活、可扩展。 工厂模式主要分为三种类型&#xff1a;简单工厂模式、工厂方法…

#Ubuntu(修改root信息)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;命令行终端&#xff1a; a.右键&#xff0c;open terminal b.快捷键 ctrlaltt &#xff08;2&#xff09;进行root修改 sudo passwd &a…

【LeetCode周赛】第 389 场周赛

目录 3083. 字符串及其反转中是否存在同一子字符串 简单3084. 统计以给定字符开头和结尾的子字符串总数 中等3085. 成为 K 特殊字符串需要删除的最少字符数 中等3086. 拾起 K 个 1 需要的最少行动次数 困难 3083. 字符串及其反转中是否存在同一子字符串 简单 3083. 字符串及其…

程序员快速自我提升法——鱼皮大佬

0 软件开发人员自我成长 1 每天读2~3篇文章&#xff0c;可以行业趋势、技术类(和自己的工作有关的) 大厂技术博客科技资讯类&#xff1a;量子位、差评、新智元、无敌信息差 量子位、新智元经验分享、编程趋势、技术干活&#xff1a;程序员鱼皮、小林coding、java guide、程序…

【推荐系统】NCF神经协同过滤

NCF框架 NCF框架是本文要实现的3个模型的主体结构。 首先是输入层&#xff0c;分别包含两个特征向量 v u v_u vu​和 v i v_i vi​&#xff0c;描述了用户u和物品i。输入仅由一个用户向量和一个物品向量构成&#xff0c;它们分别是以one-hot编码的二值化稀疏向量。 接着是Em…

[HNCTF 2022 WEEK2]e@sy_flower

获取基本信息 获取关键字符串 进来“开门红” 上一篇博客才发现这个 按u转换为二进制 有个无效db&#xff0c;最简单的花指令 nop掉 重新u一下p一下 就正常了 然后编译完main函数 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {signed in…

机器学习算法大全(MLS-C01)

算法名字监督学习简介和用途协同过滤是推荐算法Factorization Machines algorithm否推荐算法&#xff0c;准确度更高&#xff0c;不会误打扰。KNN否利用已知样本&#xff0c;找最邻近的样本的分类算法K-means否聚类算法RCF否异常检测Latent Dirichlet Allocation否主题提取和文…

Python深度学习技术教程

原文链接&#xff1a;Python深度学习技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597949&idx4&sn65c0d353d02b060fec98ec799f217ae1&chksmfa823e9acdf5b78cd71cfcb060e3b60125b17afbe3e19ef423d4709d2df7fc93d90ce3097253&token14787…

Unity InputField实现框自适应内容简便方法

要实现InputField框自适应输入内容&#xff0c;除了通过代码进行处理&#xff0c;还可以是使用以下简便的方法。 1、创建InputField组件&#xff1a;右键->UI->Input Field -TextMeshPro。 2、把Input Field Settings中的Line Type设置为Multi Line Newline模式&#x…

Jenkins + Docker + ASP.NET Core自动化部署

本来没想着要写这篇博客&#xff0c;但是在实操过程中&#xff0c;一个是被网络问题搞炸了心态&#xff08;真心感觉网络能把人搞疯&#xff0c;别人下个包、下个镜像几秒钟搞定&#xff0c;我看着我的几KB小水管真是有苦说不出&#xff09;&#xff0c;另一个就是这里面坑还是…

5. 最长回文子串

5. 最长回文子串 中等 相关标签 相关企业 提示 给你一个字符串 s&#xff0c;找到 s 中最长的回文 子串 。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;&quo…

2024.2.28 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | OPPO流程IT团队 校招扩招 &#xff08;内推&#xff09; 校招 | OPPO流程IT团队 校招扩招 &#xff08;内推&#xff09; 2、校招 | 顺丰集团2024届春季校园招聘正式启动&#…

【Java】高级篇1:异常处理

异常&#xff1a;程序在执行过程中出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 Java的异常抛出机制 Java异常体系 1、Throwable 2、Error和Exception 异常处理方式 1、try-catch-finally&#xff08;捕获异常&#xff09; 基本结构&#xff1a; 使用…

算法笔记p328_并查集

目录 并查集的定义并查集的基本操作初始化查找合并 路径压缩 并查集的定义 并查集是一种维护集合的数据结构&#xff0c;支持下面两个操作&#xff1a; 合并&#xff1a;合并两个集合。查找&#xff1a;判断两个元素是否在一个集合。 并查集用一个数组实现&#xff1a; int…

OpenJudge - 12:计算2的N次方

总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N<100)&#xff0c;计算2的n次方的值。 输入 输入一个正整数N。 输出 输出2的N次方的值。 样例输入 5 样例输出 32 关键代码 #include<stdio.h> int main() {int n,a[51] {0},c[51] {0},count 0…

Day68:WEB攻防-Java安全原生反序列化SpringBoot攻防heapdump提取CVE

目录 Java安全-反序列化-原生序列化类函数 原生序列化类函数 SnakeYaml XMLDecoder ObjectInputStream.readObject 工具利用 ysoserial Yakit SerializedPayloadGenerator Java安全-SpringBoot框架-泄漏&CVE SpringBoot Actuator-黑白盒发现 人工识别 BurpSui…

数据库事务中“锁”的分类

数据库事务中的锁可以按照不同的维度进行分类。以下是一些常见的分类方式&#xff1a; 1、按锁的粒度分类&#xff1a; 行锁&#xff08;Row-level lock&#xff09;&#xff1a;锁定单个或少量的数据行。这种锁粒度小&#xff0c;允许高度的并发&#xff0c;但管理开销大。页…

LeetCode 2312.卖木头块:动态规划(DP)

【LetMeFly】2312.卖木头块&#xff1a;动态规划(DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/selling-pieces-of-wood/ 给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, …

【蓝桥杯】蓝桥杯嵌入式——题目总结及文章汇总(内含客观题与主观题,并且都附有详细题解)

介绍 蓝桥杯嵌入式比赛是一项专注于嵌入式开发的全国性比赛&#xff0c;旨在鼓励和促进嵌入式系统的研究和应用&#xff0c;提高嵌入式开发的水平和技能。 比赛分为初赛和复赛两个阶段。初赛难度适中&#xff0c;注重考查参赛选手的嵌入式系统开发能力和实践经验。复赛则采用线…