剑指offer 15:链表的倒数第k个节点

题目描述

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

解题思路

使用快慢指针法,让快指针先走k步,然后再让慢指针开始走,当快指针到达链表尾部时,慢指针刚好到达倒数第k个节点。

C++代码实现:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {    
        if(pListHead==NULL){
            return NULL;
        }
        ListNode *p1,*p2;
        p1=pListHead;
        int count=0;
        int pos=k;
        while(pos>0 && p1!=NULL){
           p1=p1->next;
           pos--;
           count++;
        }
        //如果链表长度不到K,输入不合法,返回NULL
        if(count!=k){
            return NULL;
        }
        p2=pListHead;
        while(p1!=NULL){
           p1=p1->next;
           p2=p2->next;
        }
        return p2;
    }
};

原文地址:https://www.cnblogs.com/fancy-li/p/11614388.html

时间: 2024-10-08 00:59:22

剑指offer 15:链表的倒数第k个节点的相关文章

剑指OFFER之链表中倒数第k个节点(九度OJ1517)

题目描述: 输入一个链表,输出该链表中倒数第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个结点. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def FindKthToTail(self, head, k): # 由于k是从1开始的,因此需要特殊处理空链表和k<1的情况 if not head or k < 1: return None fast = head # 快指针先走k-1步 for _ in range(

【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 14. 链表中倒数第k个结点 (链表)

题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目地址 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 三个特例:如果输入的链表为空:k大于链表的长度:k为0的情况.对于正常情况,设置两个指针分

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

[问题描述] 输入一个链表,输出该链表中倒数第k个结点. 时间限制:1秒 空间限制:32768K [AC代码] p先走k步,q再走,这样p和q的距离就是k了,等p走到尽头,那么q自然就到了倒数第k个位置了. 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 1

剑指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 (15) 链表倒数第K个结点

题目: 输入一个链表,输出该链表中倒数第k个结点 (注意:我们将链表最末一个结点记为 倒数第1个结点,也就是k从1开始计数) 解题分析: 方法一:遍历链表两次,第一次统计链表结点个数,第二次遍历就可以找到倒数第K个结点 方法二:遍历链表一次 我们使用两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针一直指向链表开头并保持不动 从第k步开始,两个指针同时向前走,这时 两个指针之间的距离一直是k-1 当第一个指针到达链表尾结点时,第二个指针指向链表倒数第k个结点 1 ListNod

剑指offer系列12---链表倒数第k个结点

[题目]输入一个链表,输出该链表中倒数第k个结点. [思路]方法3:设置两个指针,第一个指针先走k-1步,第2个指针开始走,(这时候第一个指针指向第k个)当第一个指针走到尾部时(即走了k步),第一个指针即指向第k个结点.(推荐的方法) 方法2:先获取结点个数,再顺数第n-k+1个结点 1 2 3 4 5 6 方法1:先获取长度,再复制至数组一中,再反序加至数组2中,这时候要输出倒数第K个数即为数组2中的顺数第k-1个数.此处出现的异常不知道该怎么处理.(我的方法) 1 package com.e

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

剑指offer之链表

//剑指offer 之 链表 //面试题6 从尾到头打印链表 /***************************************************************************************** 问题描述: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 链表节点定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; *******************************