第22题:链表中倒数第k个结点
题目描述
题目:输入一个链表,输出该链表中倒数第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个结点的更多相关文章
- 【Offer】[22] 【链表中倒数第k个结点】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路分析 采用双指针的方法,第一个指针首先向前移动k-1个位置,第二个指针指向头节点,然后将 ...
- 【Java】 剑指offer(22) 链表中倒数第k个结点
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...
- 《剑指offer》第二十二题(链表中倒数第k个结点)
// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...
- 链表中倒数第k个结点 【微软面试100题 第十三题】
题目要求: 输入一个链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 参考资料:剑指offer第15题 题目分析: 1.两个指针,第一个先走k步,然后两个指针同时走,直到第一个走 ...
- 剑指Offer:链表中倒数第k个结点【22】
剑指Offer:链表中倒数第k个结点[22] 题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思考 我们定义两个指针L和R,R事先移动K-1个位置,然后两者同时往后移动直到遇到R的下个节点为 ...
- IT公司100题-13-求链表中倒数第k个结点
问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法 ...
- 输出单项链表中倒数第k个结点——牛客刷题
题目描述: 输入一个单向链表,输出该链表中倒数第k个结点 输入.输出描述: 输入说明:1.链表结点个数 2.链表结点的值3.输入k的值 输出说明:第k个结点指针 题目分析: 假设链表长度为n,倒数第k ...
- 剑指Offer编程题(Java实现)——链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 注意: 该题目不可以用先反转链表再输出第k个结点的方式,因为反转链表会改变该结点的next指向 思路一 使用栈Stack倒序存储,顺序pop第k个 ...
- 【剑指Offer面试编程题】题目1517:链表中倒数第k个结点--九度OJ
题目描述: 输入一个链表,输出该链表中倒数第k个结点. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和k(0< ...
随机推荐
- Python之PIP安装
Python有两个著名的包管理工具easy_install.py和pip.Python2.7的安装包中自带了easy_install.py,而pip需要手动安装.而在Python3.5之后都是默认安装 ...
- BZOJ 4264 小C找朋友 哈希+脑子
好吧我觉得是脑子,别人觉得是套路$qwq$ 这道题相当于是求除了$u,v$两点互相连接,所连的点相同的点对$(u,v)$ 我们首先每个点一个随机权值,对于$u$点记为$w[u]$,然后记与$u$点相连 ...
- string中执行sql语句
Spring(JdbcTemplate.class)中的queryForMap().queryForObject().queryForLong().queryForInt()等方法都会去调用publi ...
- PIE使IE浏览器支持CSS3属性(圆角、阴影、渐变)
http://www.360doc.com/content/12/1214/09/11181348_253939277.shtml PIE使IE浏览器支持CSS3属性(圆角.阴影.渐变) 2012-1 ...
- JPA教程
http://www.yiibai.com/jpa/jpa_criteria_api.html
- bitnami-redmine Apache服务启动不起来
方法一: 通过 netstat -a -o 查看端口占用情况,关闭调用相关端口的进程. c:\> netstat -a -o Active Connections Proto Local ...
- RabbitMQ使用教程(三)如何保证消息99.99%被发送成功?
1. 前情回顾 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例 RabbitMQ使用教程(二)RabbitMQ用户管理,角色管理及权限设置 在以上两篇博客发布后 ...
- 【踩坑】socket.io服务器不能访问
今天在单机测试socket.io服务器时一切正常,但用jar包的方式部署在服务器时发现客户端无法连接. 于是做了一系列排查,如检查端口是否在占用,防火墙有没有开放该端口,阿里云终端是否有开放安全组,本 ...
- Java基础反射-调用类
Student类 package com.test.wang; import java.lang.reflect.Constructor; import java.lang.reflect.Field ...
- java - Socket简单编程实践
1.简介: 1)SOCKET是应用程序和网络之间的一个接口.SOCKET创建设置好以后,应用程序可以: 通过网络把数据发送到socket . 通过网络从socket接收数据.(通信的前提是应用程序知道 ...