剑指offer面试题22:链表中倒数第k个节点

面试题22:链表中倒数第k个节点

题目:

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

示例:

复制代码
输入: 1->2->3->4->5 和 k = 2
输出: 4

思路:

1、求倒数第k个节点的值,我们归纳出当总共有n个节点时,倒数第k个节点就相当于从头开始的第n-k+1个节点。此方式要遍历两次链表第一次求出链表总数,第二次才能解出倒数第k个节点。

2、我们还可以设置两个指针都同时指向头结点,第一个指针先走k-1步然后第二个指针开始跟第一个指针一起向后遍历,当第一个指针遍历到最后一个元素时,第二个指针就是指向的倒数第k个节点。

代码:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        if(head==NULL||k==0)
            return NULL;
        ListNode* first_index  = head;
        ListNode* second_index = head;

        for(int i=0;i<k-1;i++){
            if(first_index->next==NULL)
                return NULL;
            first_index = first_index->next;
        }

        while(first_index->next!=NULL){
            first_index = first_index->next;
            second_index = second_index->next;
        }

        return second_index->val;
    }
};

注:

以下情况会导致代码崩溃,需要考虑

  1. 输入head为空指针。
  2. 输入head为头节点的链表的节点总数少于k。
  3. 输入参数k为0。由于k是无符号整数,在for循环中k-1将得到4294967295。

考点:

1.考察链表的理解

2.考察所写代码的鲁棒性

相关推荐
风筝在晴天搁浅33 分钟前
hot100 239.滑动窗口最大值
数据结构·算法·leetcode
夏乌_Wx44 分钟前
练题100天——DAY31:相对名次+数组拆分+重塑矩阵
数据结构·算法
LYFlied1 小时前
【算法解题模板】-解二叉树相关算法题的技巧
前端·数据结构·算法·leetcode
爱学习的小仙女!1 小时前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
Trouvaille ~2 小时前
【C++篇】把混沌映射成秩序:哈希表的底层哲学与实现之道
数据结构·c++·stl·哈希算法·散列表·面向对象·基础入门
Yeats_Liao2 小时前
MindSpore开发之路(四):核心数据结构Tensor
数据结构·人工智能·机器学习
菜鸟233号3 小时前
力扣78 子集 java实现
java·数据结构·算法·leetcode
Han.miracle3 小时前
数据结构与算法--008四数之和 与经典子数组 / 子串问题解析
数据结构·算法
AI科技星3 小时前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模
月明长歌4 小时前
【码道初阶】【Leetcode94&144&145】二叉树的前中后序遍历(非递归版):显式调用栈的优雅实现
java·数据结构·windows·算法·leetcode·二叉树