22 链表中倒数第k个节点

Lin2J
2021-07-21 / 0 评论 / 85 阅读
温馨提示:
本文最后更新于2021-07-21,若内容或图片失效,请留言反馈。

剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

解题思路:

使用快慢指针解决这个问题。

一开始快慢指针 $fast$、$slow$ 都指向链表表头,然后快指针 $fast$ 先走 $k$ 步之后,$slow$ 指针开始移动,两个指针同时移动。当 $fast$ 到达重点时,$slow$ 指针刚好到达倒数第 $k$ 个节点。

代码:

public ListNode getKthFromEnd(ListNode head, int k) {
    if (head == null || k <= 0) {
        return head;
    }
    ListNode fast = head;
    ListNode slow = head;
    while (fast != null && k-- > 0) {
        fast = fast.next;
    }
    while (fast != null) {
        fast = fast.next;
        slow = slow.next;
    }
    return slow;
}

复杂度分析

  • 时间复杂度$O(N)$:$N$ 为链表的节点个数,因为 $fast$ 指针需要遍历全部的节点。
  • 空间复杂度$O(N)$:$fast$ 和 $slow$ 指针使用常数大小的额外空间。