求链表倒数第k个结点
题目:输入一个单向链表(只有指向下一个结点指针),输出链表中的倒数第k个结点。
分析:
1. 一个单向链表只有指向下一个结点的指针,所以我们无法得到前面一个结点的指针,所以不能通过最朴素的枚举法来求出。
2. 现在要求出倒数第k个结点。现在用一个指针枚举是无法求出,但是我们可以使用两个指针法(非常重要)。
初始化设置两个指针p1和p2,p1和p2都指向链表的头结点。我们可以先让指针p1指针先走到第k个结点,下一步开始两个指针p1和p2一起走,当p1指向链表最后一个结点的时候p2指向即为倒数第k个结点。
为什么呢这个方法是正确的?
当p1指向第k个结点的时候,p2和p1相差k个结点,所以当p1指向尾结点的时候,p2指向的即为倒数第k个结点。
代码:
- //链表结点
- struct ListNode{
- int value;
- ListNode *nextNode;
- };
- //求倒数第k个结点
- ListNode* GetKthFromTail(ListNode *headNode, int k){
- //数据不合法
- if((headNode == NULL) || (k <= 0)){
- return NULL;
- }
- ListNode *p1 = headNode;
- ListNode *p2 = headNode;
- int count = 1;
- //让p1先走到第k个结点
- while((count < k) && (p1 != NULL)){
- p1 = p1->nextNode;
- ++count;
- }
- //判断数据合法性
- if(p1 == NULL){
- return NULL;
- }
- //两个指针一起走,当p1指向尾结点是p2指向即为倒数第k个结点
- while(((p1->nextNode) != NULL)){
- p1 = p1->nextNode;
- p2 = p2->nextNode;
- }
- return p2;
- }
求链表倒数第k个结点相关推荐
- 面试题整理 2:求链表倒数第 k 个结点
题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int m_nKey; ListNode ...
- php输出0到5之间到数,php如何实现输出链表倒数第k个结点(代码实例)
本篇文章给大家带来的内容是关于php如何实现输出链表倒数第k个结点(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 输入一个链表,输出该链表中倒数第k个结点.第一个指针走( ...
- 【练习】c++删除链表倒数第K个结点和 插入排序算法将单链表递增排序
删除单链表倒数第K个结点 运行结果: 代码: struct node {int data;node* next;}; //删除链表的倒数第k个结点 bool delet(node*& L, i ...
- 【融博笔试题】查找单链表倒数第k个结点的值
继华赛之后,又一次倒在面试门前.基础不扎实就是不行啊! 下来做完这道题,顺便复习单链表.代码如下: //------------------------------------------------ ...
- 链表题目--2 求链表的中间结点 和 求链表中倒数第k个结点
求链表的中间结点 思路 一个走两步,一个走一步.一个走到尾,另外一个就走到了中间 /*** Definition for singly-linked list.* struct ListNode {* ...
- c语言求单链表倒数第k个节点,链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 解析 设置两个指针,一个遍历链表到第k-1个结点,第二个再开始遍历,直到遍历到链表的最后一个结点,那么第二个指针指向的,就是倒数第k个结点. Ja ...
- 【剑指offer-Java版】15链表中倒数第K个结点
链表中倒数第K个结点:快慢指针解决 需要注意的地方是 1) 可能会存在输入的链表大小小于k 2) 输入的k可能小于等于0 - 所以必须限定k大于0 public class _Q15 {public ...
- 剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解
题目来源:牛客网-剑指Offer专题 题目地址:链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 节点结构如下: public class ListNode {int val ...
- [剑指offer]面试题15:链表中倒数第k个结点
面试题15:链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6个结点,从头结点开始 ...
最新文章
- JVM启动流程和内存结构
- 常见RAID的各级别的特性简介(RAID0、1、5、6、10)
- IOS控件的应用UIPageController与UIScrollView
- matlab global(全局变量)
- 掌握 Ajax,第 1 部分: Ajax 入门简介
- 2015年C语言组混搭 C/C++
- ServerVariables 变量
- WAP技术入门(下)(转)
- 【离散数学】集合论 第三章 集合与关系(2) 集合的基本运算
- 【算法】泽勒的一致性
- 关于汉字的部件部首和独体字
- win10很多软件显示模糊_win10自带对录屏软件一直显示目前无法录制,后台录制出现问题怎么办?...
- 《人类简史》--摘录
- 安装常见的错误及解决方法(记录)
- python与其他的数据分析有什么区别_学好python和数据分析有什么关系?
- 稀疏矩阵的存储方法(DOK、LIL、COO、CSR, CRS)
- Bitmap的图片压缩汇总
- 本周总结 前端第二次作业 模仿制作百度界面
- sfm眼睛带viewtarget制作
- 笔记本双网卡实现同时访问内外网
热门文章
- 【设计模式】备忘录模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 【错误记录】Android Studio 编译报错 ( AppCompat does not support the current theme features )
- 【数据挖掘】关联规则挖掘 Apriori 算法 ( 关联规则性质 | 非频繁项集超集性质 | 频繁项集子集性质 | 项集与超集支持度性质 )
- SSH port forwarding: bind: Cannot assign requested address
- BZOJ2437 [Noi2011]兔兔与蛋蛋 【博弈论 + 二分图匹配】
- Java基础23-集合类2(Set接口,Iterator迭代器)
- Binary Tree Postorder Traversal
- 经典算法题每日演练——第十九题 双端队列
- Oracle10g 64位 在Windows 2008 Server R2 中的安装 解决方案
- malloc/new函数及malloc()的一种简单原理性实现