链表中倒数第k个结点(剑指offer)

链表中倒数第k个结点

  • 参与人数:1699时间限制:1秒空间限制:32768K
  • 通过比例:21.37%
  • 最佳记录:0 ms|8552K(来自  无声

题目描述

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

题目链接:http://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

阐述下,面试的时候觉得题目有歧义或者不懂意思的时候,一定不能直接敲,而是向面试官问清楚题目,这是很必要的,面试官会从细节里发现你的优点;

对于本题,要注意这样几点:

1、理解:最后一个结点,其实是倒数第一个结点。(而不是倒是第0个结点)即k==0

2、特别注意链表为空的情况(即:pListHead==NULL)

3、k>链表长度

思路:用两个指针来遍历这个链表;这两个指针之间的差是k-1这样就保证当前面的指针到达链表结尾的时候,后面的结点正好到达倒数第k个位置;

xiao~k写了几题链表之后,马上要进行下一步复习了。

#include<stdio.h>
#include<iostream>
using namespace std;

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) : val(x),next(NULL) {}
};
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode *p,*q;
        if(!pListHead || !k) return NULL;

        p=pListHead;
        q=p;
        int cnt=0;
        while(p)
        {
            cnt++;
            p=p->next;
            if(cnt>k)
            {
                q=q->next;
            }
        }
        if(cnt<k) return NULL;
        else return q;
    }
    ListNode* CreatList(ListNode *pHead,int n)
    {
        if(n==0) return NULL;
        ListNode *p,*q;
        pHead=new ListNode(NULL);
        p=pHead;
        cin>>p->val;
        int x;
        while(--n)
        {
            cin>>x;
            q=new ListNode(x);
            p->next=q;
            p=q;
        }
        return pHead;
    }
};
int main()
{
    int n,k;
    Solution so;
    ListNode *L;
    cin>>n;
    L=so.CreatList(L,n);
    cin>>k;
    ListNode *ans=so.FindKthToTail(L,k);
    if(ans)
        printf("%d\n",ans->val);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 17:20:35

链表中倒数第k个结点(剑指offer)的相关文章

链表中倒数第k个结点-剑指Offer

链表中倒数第k个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 用两个指针对链表进行遍历,两个指针相隔k个节点,先走的那个指针到走完时,后走的那个指针就指向第k个节点 需要注意的几点 链表可能为空,返回null k值可能为0,返回null 链表的节点可能不够k个返回null 代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/

【Java】 剑指offer(22) 链表中倒数第k个结点

正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是值为4的结点. 思路 第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点.但是需要遍历2次.后面采用了栈进行实现该

剑指offer | 链表中倒数第k个结点

先做做一些简单题找找手感,还有赞一个牛客的OJ,这样的提交方式很好,ACM那种对输入出处格式对于没有接触过ACM的人来说比较头疼,华为OJ那种格式描述不清楚的就更头疼了,卡在输入输出上就悲剧了,当然,输入输出也是需要了解的. 顺便吐槽一下华为SO挑战赛:题意有模糊的地方,挑战赛的题目没有区分度,作弊监管太松,判分规则未公开说明. 题目描述:输入一个链表,输出该链表中倒数第k个结点. 题目解析:设两个同步后移.相距k的指针就行,前面的指针触底,后面的指针即是倒数k个节点. 代码如下: 1 /* 2

【剑指offer】九,链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 分析:此题为常见的快慢指针问题,java实现时要注意空指针错误以及边界条件.使用两个指针p和q,一个指针先走k-1步,然后第二个指针开始走.当第一个指针指向单链表的最后一个节点时,第二个指针指向倒数第k个节点.代码如下: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 }

《剑指Offer》题目:链表中倒数第k个结点

题目描述:输入一个链表,输出该链表中倒数第k个结点 题目分析:因为不能直接从链表的尾部遍历,所以要分两步走: 第一步:从链表的头部开始遍历,直至链表的尾部,统计出链表结点的个数 第二步:根据链表结点的个数,计算出倒数第k个结点的位置(从头部看的位置),即n-k+1个结点,输出该结点. Java代码: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public clas

剑指Offer面试题15(Java版):链表中倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点. 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步.可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往后的指针而没有从后往前的指针,因此这种思路行不通. 既然不能从尾节点开始遍历这个链表,我们还是把思路回到头

剑指offer编程-链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 1.遍历链表得到链表的长度l,找到从前往后的第l-k+1个节点.需要遍历两遍. 2.遍历一次即可的方法:两个指针,第一个指针从头向尾移动k-1步后第二个指针开始从头向尾移动,第一个指针到尾结点时第一个指针指向倒数第k个结点. ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL || k==0) return NULL; Li

剑指OFFER之链表中倒数第k个结点

题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素.输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素. 输出: 对应每个测试案例,若有结果,输出相应的查找结果.否则,输出NULL. 样例输入: 5 2 1

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

一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了. 三.代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class So