剑指offer-链表中倒数第k个节点

题目描述

输入一个链表,输出该链表中倒数第k个结点。
例如:
输入链表:1->2->3->4->5->6->7,k = 3
输出链表:5->6->7

题解:

首先获取链表总长度len;然后让链表的头节点指针head右移len-k次,就能得到倒数第k个节点啦。
注:记得考虑边界值k=len!这种情况,我们要输出NULL,不然是通过不了滴!
My Solution(C/C++完整实现):

#include <cstdio>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

int GetLongNode(ListNode *head) {
    int len = 0;
    while (head) {
        head = head->next;
        len += 1;
    }
    return len;
}

class Solution {
public:
    ListNode * FindKthToTail(ListNode* pListHead, unsigned int k) {
        int len = GetLongNode(pListHead);
        int dect_len = len - k;
        if (dect_len >= len || dect_len < 0) {
            return NULL;
        }
        while (dect_len) {
            pListHead = pListHead->next;
            dect_len -= 1;
        }
        return pListHead;
    }
};

int main() {
    ListNode a(1);
    ListNode b(2);
    ListNode c(3);
    ListNode d(4);
    ListNode e(5);
    ListNode f(6);
    ListNode g(7);
    a.next = &b;
    b.next = &c;
    c.next = &d;
    d.next = &e;
    e.next = &f;
    f.next = &g;
    Solution s;
    ListNode *result = s.FindKthToTail(&a, 3);
    while (result) {
        printf("%d->", result->val);
        result = result->next;
    }
    return 0;
}

结果:

5->6->7->
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 10,079评论 1 45
  • 题目 输入一个链表,输出该链表中倒数第k个结点。 考察点 代码稳健性 思路 其中一个比较普遍的思路是用两个指针p,...
    Joseph_Chu阅读 1,382评论 0 0
  • 转载请注明出处:http://www.jianshu.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 8,844评论 4 74
  • 今天都做了那些有价值的成果? 思考 发现导致工作进度慢的原因之一: 问题:由于图纸太多加上重复修改多次,就会产生模...
    独行侠i阅读 1,495评论 0 0
  • 今天要赶车回南京,所以闹钟定了比往常早了一个小时,这早的一个小时是拿来写文章的。 计划是早一个小时,事实呢,还是晚...
    旦旦日记阅读 3,493评论 2 0

友情链接更多精彩内容