题目描述

题目:输入一个链表,输出该链表中倒数第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. Migration-添加表(加外键)

    public partial class _222 : DbMigration { public override void Up() { //DropForeignKey("dbo.Ass ...

  2. Hive 基本语法操练(五):Hive 的 JOIN 用法

    Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...

  3. Oracle的表操作,约束

    回顾MySQL创建表语句users(id整型/name字符串/birthday日期型,默认今天)drop table if exists users;create table if not exist ...

  4. 让javascript加载速度倍增的方法(解决JS加载速度慢的问题)

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含的方式,让javascript加载速度 ...

  5. SpringBoot | 第二十章:异步开发之异步请求

    前言 关于web开发的相关知识点,后续有补充时再开续写了.比如webService服务.发邮件等,这些一般上觉得不完全属于web开发方面的,而且目前webService作为一个接口来提供服务的机会应该 ...

  6. maven安装,使用说明,及maven Repository如何使用.

    maven的使用方法总结一下 1.首先去apache官网下载maven, http://maven.apache.org/download.cgi2.如果是windows系统,选择 apache-ma ...

  7. Chapter 18 MySQL NDB Cluster 7.3 and NDB Cluster 7.4渣翻

    Table of Contents 18.1 NDB Cluster Overview      18.2 NDB Cluster Installation      18.3 Configurati ...

  8. 一般处理程序ashx

    在用户列表中链接数据库 在这里Html只管做Post 请求,其他逻辑全部交给ashx 其中修改需要隐藏域 1.展现列表 public void ProcessRequest (HttpContext ...

  9. lazyload的使用心得

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 $("img.lazy").lazyload({   placeholder : "img/grey.g ...

  10. mockJs语法糖用例

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...