【Leetcode -剑指Offer 22.链表中倒数第k个结点 -203.移除链表元素】

news/2024/10/21 7:53:47/

Leetcode

  • Leetcode -剑指Offer 22.链表中倒数第k个结点
  • Leetcode -203.移除链表元素

Leetcode -剑指Offer 22.链表中倒数第k个结点

题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例:
给定一个链表 : 1->2->3->4->5, 和 k = 2.
返回链表 4->5.

  1. 暴力循环法

这个思路是用count计算链表的长度,返回倒数第k个结点,即是返回顺数第count-k个结点,再循环一次即可;

		struct ListNode* getKthFromEnd(struct ListNode* head, int k){if (head == NULL){return NULL;}//计算链表的长度struct ListNode* curr = head;int count = 0;while (curr){curr = curr->next;count++;}//k大于链表的长度,返回空if (k > count){return NULL;}//curr从头开始//返回倒数第k个,即是顺数count-k个curr = head;for (int i = 0; i < count - k; i++){curr = curr->next;}return curr;}
  1. 双指针

这个思路是使slow指针和fast指针相差k步,当fast走到空时,slow即是倒数的第k个结点;

例如当k等于2:
初始化完成:
在这里插入图片描述

第一次循环完成:
在这里插入图片描述

最后完成:
在这里插入图片描述

代码:

		struct ListNode* getKthFromEnd(struct ListNode* head, int k){if (head == NULL){return NULL;}struct ListNode* slow = head, * fast = head;//使slow和fast相差k步for (int i = 1; i <= k; i++){//当到这里fast为空,证明k大于链表的长度,返回空(Leetcode这道题没有k大于链表长度的案例)if (fast == NULL){return NULL;}fast = fast->next;}//保证slow和fast相差k步,直到fast为空while (fast){slow = slow->next;fast = fast->next;}return slow;}

Leetcode -203.移除链表元素

题目:给你一个链表的头节点head和一个整数 val ,请你删除链表中所有满足Node.val == 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
输出:[]

  1. 递归

递归的思路是,直接找到递归的最深处,即链表的最后NULL,从后往前判断每个结点的val是否等于要移除的val,若某个结点的val等于要移除的val,就返回当前这个结点的next回去上一层;

在这里插入图片描述
这两句的含义如下图:

在这里插入图片描述

返回后上一个结点就是新的head,即如下图:

在这里插入图片描述

代码如下:

		struct ListNode* removeElements(struct ListNode* head, int val){//当链表为空时为最深处if (head == NULL){return NULL;}head->next = removeElements(head->next, val);return head->val == val ? head->next : head;}
  1. 循环法

这个思路是直接循环寻找要移除的val,下面直接看代码和注释:

		struct ListNode* removeElements(struct ListNode* head, int val){//把头节点等于val的直接去掉,更新头结点为原来头结点的nextwhile (head != NULL && head->val == val){head = head->next;}//当head为空,返回空if (head == NULL){return NULL;}//curr从头开始遍历,判断curr的next的val是否等于要移除的val,是则更新curr的next;否则curr往后走struct ListNode* curr = head;while (curr->next){if (curr->next->val == val){curr->next = curr->next->next;}else{curr = curr->next;}}return head;}

http://www.ppmy.cn/news/48342.html

相关文章

OSCP-Clyde(rabbitmq中间件、erlang服务4369、修改Payload、nmap提权)

目录 扫描 FTP erlang服务(4369) 提权 扫描 21/tcp open ftp vsftpd 3.0.3 | ftp-anon: Anonymous FTP login allowed (FTP code 230) | drwxr-xr-x 2 ftp ftp 4096 Apr 24 2020 PackageKit | drwxr-xr-x 5 ftp ftp 4096 Apr 24 2020 apache2 | drwxr-xr-x 5 ftp ftp 409…

云原生之在kubernetes集群下部署Mysql应用

云原生之在kubernetes集群下部署mysql应用 一、Mysql介绍二、kubernetes集群介绍1.k8s简介2.k8s架构图 三、本次实践介绍1.本次实践简介2.本次环境规划 三、检查本地k8s集群环境1.检查k8s各节点状态2.检查k8s版本3.检查k8s系统pod状态 四、编辑mysql.yaml文件五、创建mysql应用…

Redis分布式锁有哪些缺点?如何解决?

目录 一、死锁问题&#xff1a; 二、锁竞争问题&#xff1a; 三、时效性问题&#xff1a; 四、单点故障问题&#xff1a; 五、高并发量下锁抢占时间长的问题 一、死锁问题&#xff1a; 因为每个客户端在设置锁过期时间时可能出现网络延迟等原因&#xff0c;有可能出现某个…

五项热门技术领域和应用场景

介绍五种当下比较热门的技术&#xff0c;分别是人工智能、云计算、数据分析、微服务和区块链。每种技术都有自己的定义、子领域、应用场景和学习难度。这些技术都有着广阔的发展前景和市场需求&#xff0c;对于想要从事或了解这些领域的人来说&#xff0c;都是很有价值的知识。…

centos7安装nginx的三种方式~yum源,源码,Docker

目录 1.yum安装&#xff1a;Centos7源默认没有nginx 2.源码安装&#xff1a; 3.Docker安装&#xff1a; 1.yum安装&#xff1a;Centos7源默认没有nginx 配置yum源&#xff1a; wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 查看nginx源&…

Vue中的路由导航

声明式路由导航 router官网-起步 声明式路由导航其实就是使用官方给的<router-link>路由导航标签直接进行路由跳转 <body> <div id"app"><!--<router-link>路由导航标签&#xff0c;用于找到path属性中url对应的组件&#xff0c;通过传入…

Spring的循环依赖

什么是循环依赖&#xff1f; 循环依赖其实就是循环引用&#xff0c;也就是两个或者两个以上的 bean 互相持有对方&#xff0c;最终形成闭环。比如 A 依赖于 B&#xff0c;B 依赖于 C&#xff0c;C 又依赖于 A。如下图&#xff1a; 注意&#xff0c;这里不是函数的循环调用&…

rk3568-rk809电池电量计

简介&#xff1a; RK809 集成在RK3568上的一个高性能的 PMIC&#xff08;(Power Management IC):电源管理集成电路&#xff09;&#xff0c;PMIC全称Power management integrated circuit&#xff0c;一般情况下是一颗独立于主控的芯片&#xff0c;集成了电源控制&#xff0c;电…