题目描述

题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。

考点

鲁棒性:指针为nullptr,链表节点数少于K,输入的K为0

双指针遍历:只用遍历一次,复杂度O(n)

unsigned int: 为0的时候,k-1会变成0xFFFFFFFFF,4294967295,进入无限死循环

第一遍

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
//1.鲁棒性检查,nullptr链表,k=0的情况,返回nullptr
if (pListHead == nullptr || k == 0)
return nullptr; //2.定义双指针,第一个指向头节点,第二个指向nullptr
ListNode* first = pListHead;
ListNode* second = nullptr; //3.第一个指针向前走k-1步
for (int i = 0; i < k-1; i++)
{
//3.1如果k比链表节点大,返回nullptr
if (first->m_pNext == nullptr)
return nullptr;
//3.2 否则,向前走一步
else
first = first->m_pNext;
} //4.第二个指针开始走
second = pListHead; //5.当第一个指针直到最后一个节点时,第二个指针指向倒数第k个节点
while (first->m_pNext!=nullptr)
{
first = first->m_pNext;
second = second->m_pNext;
} //6.返回第二个指针的值
return second;
}

注意:

//3.第一个指针向前走k-1步
    for (int i = 0; i < k-1; i++)
    {        
        //3.1如果k比链表节点大,返回nullptr
        if (first->m_pNext == nullptr)
            return nullptr;
        //3.2 否则,向前走一步
        else
            first = first->m_pNext;
    }

要先判断first->m_pNext是否存在,再往后走一个


第二遍

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
//1.鲁棒性检查
if(pListHead==nullptr||k==0)
return nullptr; //2.定义双指针
ListNode* first=pListHead;
ListNode* second=nullptr; //3.第一指针先走K-1步
for(int i=0;i<k-1;i++)
{
//3.1 鲁棒性检查,如果k大于链表节点,返回nullptr
if(first->next==nullptr)
return nullptr;
//3.2 否则往下走一步
else
first=first->next;
} //4.第二个指针开始走
second = pListHead; //5.直到第一个指针走到最后一个节点,第二个指针就是倒数第K个数,他们的距离是k-1
while(first->next!=nullptr)
{
first=first->next;
second=second->next;
} //6.返回这时的第二个指针
return second;
}
};

相关题目

求链表的中间节点,如果链表中的节点总数为奇数,则返回中间节点;如果节点总数是偶数,则返回中间两个节点的任意一个。

为了解决这个问题,我们也可以定义两个指针,同时从链表的头节点出发,一个指针一次走一步,另一个指针一次走两步。

当走得快的指针走到链表的末尾时,走得慢的指针正好在链表的中间。

struct ListNode {
int val;
ListNode *next; }; ListNode* FindIntermediateNode(ListNode* pHead) {
if (pHead ==nullptr)
return nullptr; ListNode* pFast = pHead;
ListNode* pSlow = pHead; while (pFast != NULL && pFast->next != NULL) {
pFast = pFast->next->next;
pSlow = pSlow->next;
} return pSlow;
}

第22题:链表中倒数第k个结点的更多相关文章

  1. 【Offer】[22] 【链表中倒数第k个结点】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路分析 采用双指针的方法,第一个指针首先向前移动k-1个位置,第二个指针指向头节点,然后将 ...

  2. 【Java】 剑指offer(22) 链表中倒数第k个结点

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...

  3. 《剑指offer》第二十二题(链表中倒数第k个结点)

    // 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...

  4. 链表中倒数第k个结点 【微软面试100题 第十三题】

    题目要求: 输入一个链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 参考资料:剑指offer第15题 题目分析: 1.两个指针,第一个先走k步,然后两个指针同时走,直到第一个走 ...

  5. 剑指Offer:链表中倒数第k个结点【22】

    剑指Offer:链表中倒数第k个结点[22] 题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思考 我们定义两个指针L和R,R事先移动K-1个位置,然后两者同时往后移动直到遇到R的下个节点为 ...

  6. IT公司100题-13-求链表中倒数第k个结点

    问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法 ...

  7. 输出单项链表中倒数第k个结点——牛客刷题

    题目描述: 输入一个单向链表,输出该链表中倒数第k个结点 输入.输出描述: 输入说明:1.链表结点个数 2.链表结点的值3.输入k的值 输出说明:第k个结点指针 题目分析: 假设链表长度为n,倒数第k ...

  8. 剑指Offer编程题(Java实现)——链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 注意: 该题目不可以用先反转链表再输出第k个结点的方式,因为反转链表会改变该结点的next指向 思路一 使用栈Stack倒序存储,顺序pop第k个 ...

  9. 【剑指Offer面试编程题】题目1517:链表中倒数第k个结点--九度OJ

    题目描述: 输入一个链表,输出该链表中倒数第k个结点. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和k(0< ...

随机推荐

  1. JMETER断言:终极指南

    你想要: 检查服务器响应是否包含特定字符串, 或验证服务器返回了HTTP 200 OK, 或者检查json字段的值(使用类似JsonPath$.store..price). 断言是要走的路. 问题是: ...

  2. JMeter - 实时结果 - InfluxDB和Grafana - 第1部分 - 基本设置

    概述: 在本文中,我将解释如何使用JMeter + InfluxDB + Grafana获得实时性能测试结果. 请注意,此主题太大,无法涵盖一篇文章中的所有内容.所以,我试图提供与TestAutoma ...

  3. 6、python数据类型之元组(dict)

    字典字典的每个元素就是一个键值对,格式如下key:value{key1:value1,key2:value2,......} 1.创建 dict_eg = { "name":&qu ...

  4. 【JavaScript权威指南】——逻辑与(&&)

    三种用法总结: 1.布尔值计算: [成员]={false,true} 2.“真值”,“假值”计算: [假值]={false,null,undefined,0,-0,NaN,""} ...

  5. luogu P5142 区间方差 十分优美的线段树

    又来了个维护方差的线段树.... 大致推导过程(字丑多包涵QAQ) 注意取模时要加一些100000007防止出现负数.. #include<cstdio> #include<iost ...

  6. K 大神的博弈知识汇总

    博弈知识汇总 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻 ...

  7. maven POM总结

    可继承的字段 version property 其他占坑: parent import scope   Dependency_Management中的scope是可以被继承的,http://maven ...

  8. Binary Strings Gym - 101161G 矩阵快速幂 + 打表

    http://codeforces.com/gym/101161/attachments 这题通过打表,可以知道长度是i的时候的合法方案数. 然后得到f[1] = 2, f[2] = 3, f[3] ...

  9. C A Simple Job

    题目3 : A Simple Job时间限制:1000ms单点时限:1000ms内存限制:256MB描述Institute of Computational Linguistics (ICL), Pe ...

  10. 【好书推荐】《剑指Offer》之软技能

    俗话说,对于程序员来讲,每年都应该出去面试一下,看看自己的技术能力在外面处于什么水平.程序员在一个公司一个环境一个业务干得太久,很容易丧失学习的动力,获得的仅仅是从新手到熟手.当然,我相信在各行各业均 ...