第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 freeze >requirements.txt 安装 pip install -r requirements.txt
- 将vue和element-ui写在一个html里面方便调试(小白篇)
声明:纯属小白进门文档 vue的官方文档: https://vuejs.bootcss.com/v2/guide/ 第一步:引入vue.js <script src="https:// ...
- 分别使用http,express,koa请求第三方接口
今天又再次恶补了一下http的内容,确切地说是node.js里面的http的内容,啊,百度了半天express怎么请求第三方接口,结果发现自己买的入门书籍都有这个内容.舍近求远,我真是醉了.还有百度上 ...
- linux下生成随机密码
常见的简单的两种方法 1.openssl rand -base64 32 2.date | md5sum
- Uva12174
#include <bits/stdc++.h> using namespace std; ; int t; int s,n; ]; ]; ]; void init(){ memset(a ...
- html 页面跳转方式
网页的跳转在很多时候都非常的有用,下面的是两个简单的例子.仅供参考. 一.用<meta>里直接写刷新语句:5秒后跳转到百度 <html> <head> <me ...
- (转)Linux 命令(40): wc 命令
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 原文:http://blog.jobbole.com/109925/ http:/ ...
- 【踩坑】vue 无法让后台保存 session
今天在调试 iblog 客户端时,发现登录后进行增加.删除.更新操作时都提示还没有登录. 此问题曾经在用 ajax 调试时出现过,解决办法是,在请求时带上 creditials: true ,即让发出 ...
- 超链接显示网站 A,访问后进入网站 B
#前端黑魔法# 出一个思考题:如何用最少的字符实现下图效果.即超链接显示网站 A,访问后进入网站 B. 当然这个是上古时代的黑魔法了,稍懂前端的都知道原理.所以这里只问最短的实现~ 一个简单的演示:( ...
- @Enable*注解的工作原理
@EnableAspectJAutoProxy @EnableAsync @EnableScheduling @EnableWebMv @EnableConfigurationProperties @ ...