对于返回倒数第 k 个节点、链表的回文结构、链表相交题目的解析

开篇介绍:

hello 大家,我又来了,本篇博客依旧是为大家带来三道题的解析,那么我们废话少说,直接进入正题,还是老样子,我们先看题目链接:

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/链表的回文结构_牛客题霸_牛客网https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=182&&tqId=34762&sourceUrl=https%3A%2F%2Fwww.nowcoder.com%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AC%2594%25E9%259D%25A2%25E8%25AF%2595%25E7%25AF%2587%26topicId%3D295面试题 02.07. 链表相交 - 力扣(LeetCode)https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/接下来,我们直接进入题目解析:

面试题 02.02. 返回倒数第 k 个节点

这道题,其实难度不大,我们可以直接秒,我们先看题目:

题意分析:

这道题要求我们找出单向链表中倒数第 k 个节点,并返回该节点的值。

关键信息提取

  • 数据结构:单向链表,每个节点包含一个值 val 和指向下一个节点的指针 next
  • 目标:找到链表中倒数第 k 个节点的值。
  • 条件:给定的 k 是有效的,无需处理 k 无效(如 k 大于链表长度等)的情况。
  • 示例辅助理解:输入链表 1->2->3->4->5k = 2,输出为 4,因为倒数第 2 个节点是值为 4 的节点。

解析:

对于这道题,咱也不讲什么乱七八糟的解法,我们直接用传奇解法:快慢指针,解决本题,大家有不了解快慢指针的,可以看一下这篇博客:对于单链表相关经典算法题:206. 反转链表及876. 链表的中间结点的解析-CSDN博客

只不过在本题中,我们的快指针不是每次走两步。

因为题目要找链表的倒数第k个节点,那么也就是说,我们先看图:

要返回倒一个节点的数据,那么这又和快慢指针有什么关系呢,根据前面所学的知识,我们知道,fast指针在为NULL的时候,终止循环,也就是说fast指针运动到了图中的NULL所示位置,那么我们不妨看看此时fast指针距离倒数第一个节点的距离为多少,巧了,正好是1,即k,那么按照惯例来说,我们的slow指针也就要在那是运动到了倒数第一个节点,那么究竟要怎么实现呢?

其实和上面说的类似,我们要让slow指针在fast指针运行到NULL的时候就运行到倒数第k个节点,那么,换句话来说,此时slow指针和fast指针的距离不正好是k吗诸位,再换句话来说就是,我们要让slow指针和fast指针保持k个节点的距离,如此,才能正好达到我们上述所说。

那么,我们又知道,在初始化的时候,我们是把fast和slow指针同时设置在头结点,那么为了让slow指针和fast指针保持k个节点的距离,我们就得在slow指针不移动的情况下,让fast指针先行k个节点,这一步很简单,我们直接借助while循环:

// 双指针法寻找倒数第k个节点:快指针先移动k步
sl* fast = head;  // 快指针,用于先行探路
sl* slow = head;  // 慢指针,最终指向倒数第k个节点
// sl* cur = head;  // 此变量在当前逻辑中未使用,可注释或删除

// 快指针先行移动k步
while (k > 0) {
    fast = fast->next;  // 快指针向前移动
    k--;                // 计数减1,直到移动k步
}

但是在这里我想给大家强调一下,大家可能会觉得说相隔k个节点就代表说两个节点之间要间隔k个节点,其实这是错的,准确来说,相隔k个节点是代表说两个节点之间要间隔k-1个节点,为什么呢?那是因为我们实际上的相隔k个节点指的是前面的那个节点要走几步才能到后面的那一个节点,就那k=2来说,它的意思是说,前面的那个节点要走2步才能到后面的那一个节点,而是不是当这两个节点之间间隔一个节点的时候,能够达到这个效果(即begin=begin->nex->next),要是中间间隔这着两个节点,那就要走4步,那么就不行,这里希望大家注意一下,这个理解很重要。

接下来,我们就可以让slow指针和fast指针同时一起移动相同的步数了,如此一来,当fast指针运动到NULL的时候,slow指针正好就停在倒数第k个节点,完整代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

typedef struct ListNode sl;

int kthToLast(struct ListNode* head, int k) {
    sl* fast=head;
    sl* slow=head;
    sl* cur=head;

    while(k)
    {
        fast=fast->next;
        k--;
    }
    //出来循环之后,fast正好在距离头结点k个节点的距离的节点的前一个节点
    while(fast!=NULL)
    {
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值