【LeetCode刷题记录】18.返回倒数第 k 个节点

132 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-返回倒数第 k 个节点

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

注意:本题相对原题稍作改动

示例:

输入: 1->2->3->4->5 和 k = 2

输出: 4

说明:

给定的 k 保证是有效的

二、思路分析:

思路一:

  1. 如果直接遍历,需要遍历两次,可以使用双指针发求解
  2. 创建两个指针和一个自定义头结点方便定位,两个指针都指向头结点
  3. 遍历k此,使得两个指针节点之间相差k个节点
  4. 进行循环移动,每次都将两个指针向后移动一个节点
  5. 当一个指针指向null时,另一个指针指向的节点即为所求值

思路二: 递归求解

三、AC 代码:

思路一:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     * int val;
     * ListNode next;
     * ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int kthToLast(ListNode head, int k) {
            ListNode headNode = new ListNode(-1);
            headNode.next = head;
            ListNode pointer1 = headNode;
            ListNode pointer2 = headNode;
            for (int i = 0; i < k; i++) {
                pointer2 = pointer2.next;
            }
            while (pointer2 != null) {
                pointer2 = pointer2.next;
                pointer1 = pointer1.next;
            }
            return pointer1.val;
        }
    }

思路二:

class Solution {
    int globalVar = 1;

    public int kthToLast(ListNode head, int k) {
        if (head.next == null) return head.val;
        int value = kthToLast(head.next, k);
        if (globalVar++ >= k) {
            return value;
        } else {
            return head.val;
        }
    }
}

四、总结:

  1. 充分利用条件“给定的 k 保证是有效的”。
  2. 递归,访问到最后的节点,再往前找之前的状态。
  3. 双指针,k既是倒数的节点,也是该节点与最末尾节点的距离。