题目:

输入一个链表,输出该链表中倒数第k个结点。

例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4.

链表结点定义:

struct ListNode{
int val;
ListNode* next;
};

思路:

1、遍历整个链表,计算结点的个数,再遍历链表,找到第n-k+1个结点;

2、通过两个指针,第一个指针先走k-1步,到达第k个结点,第二个指针指向头结点,然后两个指针同时走,每次走一步,当第一个指针走到链尾时,第二个指针恰好走到倒数第k个结点。

注意细节:链表为空,k大于链表长度或者小于1等情况。

类似问题:

a. 求链表的中间结点,如果链表中结点数为奇数,则返回中间结点;如果为偶数,则返回中间结点的任意一个。

(思路:两个指针,同时从头结点出发,一个走一步,一个走两步,走得快的指针到达链尾时,走得慢的指针正好在链表中间)

b. 判断一个单向链表是否构成环形结构。

(思路:同上,两个指针,一快一慢,如果快指针追上了慢指针,则链表成环;如果快指针走到了链尾,则不成环)

代码:

struct ListNode{
int val;
ListNode* next;
}; ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead==NULL || k<=0)
return NULL;
ListNode* pAhead=pListHead;
for(unsigned int i=1;i<k;i++){
if(pAhead->next!=NULL)
pAhead=pAhead->next;
else
return NULL;
}
ListNode *pBehind=pListHead;
while(pAhead->next!=NULL){
pAhead=pAhead->next;
pBehind=pBehind->next;
}
return pBehind;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/529d3ae5a407492994ad2a246518148a?rp=1

AC代码:

class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead==NULL || k<=0)
return NULL;
ListNode* pAhead=pListHead;
for(int i=1;i<k;i++){
if(pAhead->next!=NULL)
pAhead=pAhead->next;
else
return NULL;
}
ListNode *pBehind=pListHead;
while(pAhead->next!=NULL){
pAhead=pAhead->next;
pBehind=pBehind->next;
}
return pBehind;
}
};

(剑指Offer)面试题15:链表中倒数第k个结点的更多相关文章

  1. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  2. 剑指Offer - 九度1517 - 链表中倒数第k个结点

    剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...

  3. 剑指offer十四之链表中倒数第k个结点

    一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...

  4. 【剑指Offer】14、链表中倒数第k个结点

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

  5. 剑指offer【13】- 链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...

  6. 面试题 15:链表中倒数第 k 个结点

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

  7. 剑指offer-面试题15.链表中倒数第k个结点

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

  8. 剑指offer(14)链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ...

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

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

  10. 15 链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. p1先走k-1步,p1 p2再一起走 C++: /* struct ListNode { int val; struct ListNode *next; L ...

随机推荐

  1. log4net使用介绍

    log4net是一款开源的日志工具,现已挂在apache基金会下.非常简单灵活,初学者有时会发现log4参照资料配置好,但并不输出日志.这种情况,一般是没有准确定位到配置文件.可参阅第3步. 下载 下 ...

  2. 部署HBase远程访问的问题集合(Eclipse)

    实现远程访问HBase,可以通过Eclipse开发工具方便进行代码调试. 为了方便jar包各种版本的管理,才用maven进行代码构建 首先,下载并安装maven以及M2Eclipse插件 其次,配置m ...

  3. HDU 4741

    获得 新的模板了/// 此模板 有线段和线段的最短距离方法,同时包含线段与线段的最短距离:#include<iostream> #include<stdio.h> #inclu ...

  4. phonegap修改软件名称和图标

    修改app 图标 打开AndroidManifest.xml文件 修改application 节点 <application android:allowBackup="true&quo ...

  5. webpack的学习

    什么是webpack? 他有什么优点? 首先对于很多刚接触webpack人来说,肯定会问webpack是什么?它有什么优点?我们为什么要使用它?带着这些问题,我们来总结下如下: Webpack是前端一 ...

  6. oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件

    提示: IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件 IMP-00000: 未成功终止导入 解决方法: 用户system用户登录然后授权 grant dba to hszx

  7. android面试题(转)

    1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...

  8. C#(WinForm)实现软件注册

    转自:http://www.cnblogs.com/ynbt/archive/2011/11/02/2233470.html 源码如下:下载

  9. 提高CSS开发能力的技巧集

    1. 使用:not()给导航条添加间隔线 我们通常使用如下代码给导航条增加间隔线 /* add border */ .nav li { border-right: 1px solid #666; } ...

  10. Laravel不同数据库的模型之间关联

    假设ModelA和ModelB之间是BelongsTo的关系 如果同属于一个数据库连接 那么 public function a(){ return $this->belongsTo(" ...