(剑指Offer)面试题15:链表中倒数第k个结点
题目:
输入一个链表,输出该链表中倒数第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个结点的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
		问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ... 
- 剑指Offer - 九度1517 - 链表中倒数第k个结点
		剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ... 
- 剑指offer十四之链表中倒数第k个结点
		一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ... 
- 【剑指Offer】14、链表中倒数第k个结点
		题目描述: 输入一个链表,输出该链表中倒数第k个结点.为了符合习惯,从1开始计数,即链表的尾结点是倒数第1个节点.例如,一个链表有6个结点,从头结点开始,它们的值依次是1,2,3,4,5,6. ... 
- 剑指offer【13】-  链表中倒数第k个结点
		输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { ... 
- 面试题 15:链表中倒数第 k 个结点
		面试题 15:链表中倒数第 k 个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点.例如一个有 6 个结点的 链 ... 
- 剑指offer-面试题15.链表中倒数第k个结点
		题目:输入一个链表,输出该链表的倒数第K个结点.为了符合大多数人的习惯,本题 从1开始计数,即链表的尾结点是倒数第1个节点.例如有一个链表有6个节点,从 头节点开始他们的值依次是1,2,3,4,5,6 ... 
- 剑指offer(14)链表中倒数第K个节点
		题目描述 输入一个链表,输出该链表中倒数第k个节点. 题目分析 用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点. 这时候两个一起跑.当第一个 ... 
- 【Offer】[22] 【链表中倒数第k个结点】
		题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路分析 采用双指针的方法,第一个指针首先向前移动k-1个位置,第二个指针指向头节点,然后将 ... 
- 15 链表中倒数第k个结点
		输入一个链表,输出该链表中倒数第k个结点. p1先走k-1步,p1 p2再一起走 C++: /* struct ListNode { int val; struct ListNode *next; L ... 
随机推荐
- java中正则表达式的应用
			java.util.regex Pattern的应用 public static void main(String[] args) { //简单的正则匹配.从给定的字符串中匹配正则表达式 //匹配 ... 
- jQuery基础知识--Form基础
			form中的单行文本获取和失去焦点 <!DOCTYPE html> <html> <head lang="en"> <meta chars ... 
- android 中如何获取camera当前状态
			/** * 测试当前摄像头能否被使用 * * @return */ public static boolean isCameraCanUse() { boolean canUse = true; Ca ... 
- DataTable添加列和行的三种方法
			JRoger 原文 #region 方法一: DataTable tblDatas =new DataTable("Datas"); DataColumn dc =null; dc ... 
- Yii: 设置数据翻页
			一种方法是使用CPagination处理翻页需要的数据如:总数据项数,每页数据项数,当前页,然后在视图中使用CBasePager来绘制. 控制器动作的代码示范: function actionInde ... 
- 浏览器的DNS缓存
			通过设置hosts文件可以强制指定域名对应的IP,当修改hosts文件,想要浏览器生效,最直接的方法关闭浏览器后重新开启:如果不想重启浏览器,只需要清空浏览器的DNS缓存即可.清空DNS缓存在chro ... 
- django-grappelli 安装配置
			在python34/scripts文件夹下pip3 install django-grappelli pip安装一般会装在python34的tools或lib之类的文件夹下,一定要找到那个文件夹,gr ... 
- TopFreeTheme精选免费模板【20130619】
			今天给大家推荐7款最新精选的WordPress主题和一个WooCommerce订单跟踪插件,如果你有更换自己博客主题的想法或者正要做自己的博客,不妨试试.一些是WordPress商业模板,但都可以免费 ... 
- TopFreeTheme精选免费模板【20130617】
			今天给大家推荐8款最新的WordPress和Joomla主题,它们绝大部分都是屏幕自适应主题,Mobile相当友好.如果你喜欢它们,就赶快收藏起来吧. Spacing – 来自Themeforest的 ... 
- 修改docker的默认存储位置
			service docker stop mv /var/lib/docker /mnt/docker ln -s /mnt/docker /var/lib/docker ls /var/lib/doc ... 
