当前位置: 首页 > news >正文

【链表OJ题(三)】链表中倒数第k个结点

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:数据结构
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 链表OJ题(三)
    • 1. 链表中倒数第k个结点
      • 思路1--两次遍历
      • 思路2-快慢指针
  • 2.总结:

上一篇链表OJ题链接:【链表OJ题(二)】链表的中间节点

链表OJ题(三)

1. 链表中倒数第k个结点

链接:链表中倒数第k个结点

描述:
输入一个链表,输出该链表中倒数第k个结点。

示例1::

输入:
1,{1,2,3,4,5}
返回值:
{5}

思路1–两次遍历

和求链表的中间节点的方法一相似,为直接法。

要求链表的倒数第 k 个节点,那么就是删除链表正数第 len(链表长度) - k + 1 个节点。

举个例子,例如链表长度为 5,删除倒数第 2 个节点,就是删除链表正数第 4 个节点,推导出来就是第 len + 1 - k 个节点。
所以只要先算出链表长度,然后遍历到 len + 1 - k 个节点返回即可。

注意
1.在计算出链表总长度len<k或k<=0时,直接返回NULL。
2.传递的是空链表,直接返回NULL

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{struct ListNode*cur,*ans;cur=ans=pListHead;int len=0;while (cur) {cur=cur->next;len++;}if(k<=0||k>len)return NULL;for (int i=0; i<len-k; i++) {ans=ans->next;}return ans;
}

在这里插入图片描述

既然这道题目也可以用直接法,那么能否也适用于快慢指针?事实上可以,而且这道题的方法也很巧妙,接下来看思路2

思路2-快慢指针

在上一篇博客中我们也使用了快慢指针
给定一个快指针 fast 和一个慢指针 slow;我们要求链表倒数第 k 个节点,那么我们就先让快指针走 k 步;然后让 fast 和 slow 一起走,当 fast 走到空指针,这时 slow 为倒数第 k 个节点。
在这里插入图片描述

那么这里的原理是什么呢?
首先让 fast 走 k 步,让 fast 和 slow 的间隔为 k。链表的倒数第 k 个节点,就是正数 len + 1 - k 个节点,那么当 fast 走到空指针后,链表走完,那么现在 fast 走的距离就相当于链表的长度len + 1,fast 和 slow的间隔为 k ,那么现在的 slow 就为正数 len + 1 - k个节点,这时返回 slow就是倒数第 k 个节点。

注意:如果在 fast 走 k 步的过程中,fast 迭代为了空指针,这时直接返回空指针。

代码:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{struct ListNode* fast, *slow;fast = slow = pListHead;if (pListHead == NULL)return NULL;// fast 先走 k 步while (k--)//走k次,(--k)走k-1次{// 放置 fast 先走到空if (fast == NULL){return NULL;}fast = fast->next;}// 迭代while (fast){slow = slow->next;fast = fast->next;}return slow;
}

在这里插入图片描述

2.总结:

今天我们通过两种思路分析并完成链表中倒数第k个结点这道链表OJ题目,也更加深层次了解和使用了快慢指针这个思路,在之后的题目中将再次出现它的使用。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

http://www.lryc.cn/news/39358.html

相关文章:

  • 华为防火墙的学习
  • SPI 接口OLED 模块 - 兼容5V 和3.3V 电平
  • css布局和定位
  • python -- 批量读取多个文件,并将每个文件中相同变量累加
  • 低代码开发流程是怎么样的?
  • 任何时候都不要在 for 循环中删除 List 集合元素!!!
  • koa+Vite+vue3+ts+pinia构建项目
  • k8s-yaml文件
  • 存储引擎
  • Go中 channel的使用
  • 【C++】string OJ练习
  • 进程间通信IPC
  • 操作系统-页面淘汰算法(下)-软件设计(二十六)
  • 23种设计模式-责任链模式(Android开发实际应用场景介绍)
  • Socket+Select+Epoll笔记
  • git查看最近修改的文件
  • 【算法基础(四)】堆排序(二)
  • C++类型转换
  • Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)
  • 蓝桥杯刷题第九天
  • a-tree-select 基本使用,下拉框高度和宽度设置、回显时滚动条定位解决。
  • 【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警
  • cdn简单配置
  • 前端安全(自留)
  • 零基础转行云计算可行吗
  • 【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
  • 孩子免费就读|私企经理自费赴美国东海岸高校访学
  • 前端面试hr经常会问的问题
  • C动态数组
  • 【STL一】STL组件(容器、迭代器、算法)