剑指Offer

剑指Offer——链表中倒数第 K 个结点

2019-05-16  本文已影响0人  KEEPINUP

题目描述

输入一个链表,输出该链表中倒数第 k 个结点。
时间限制:1 秒 空间限制:32768K
本题知识点: 链表

代码实现

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head, int k) {
        ListNode node = head, temp = head;
        int i = 0;
        for(; node != null; i++){
            if(i >= k){
                temp = temp.next;
            }
            node = node.next;
        }
        return k > i ? null : temp;
    }
}

解题思路

首先我们要知道什么是链表,可以通过参考文章底部的推荐文章进行了解。简单来说就是它有一系列结点组成,每个结点包括一个数据结构(用来存放各类型的数据),还包括一个指向下一个结点的指针。

因为题中给出的链表为单链表,每个结点只有下一个结点的指针,而没有前一个结点的指针,所以我们要想知道倒数第 k 个结点,我们首先需要从第一个结点开始一直找到最后一个结点,得到共有多少个结点,然后再算出倒数第 k 个结点是整数第几个结点,然后再从第一个结点开始直到找到最终要找的结点。

但是我们这里使用的方法很巧妙,我们定义两个指针都指向第一个结点,然后让其中一个指针 node 先走 k 步,然后 temp 指针再开始走,直到 node 走到最后,因为 node 比 temp 始终快 k 步,所以最后 temp 指向的结点就是倒数第 k 个结点,不过这里有个前提就是 k 不能大于我们所有结点的总数,如果大于的话,是没有倒数第 k 个结点的,所以返回空。

上一篇下一篇

猜你喜欢

热点阅读