《剑指 Offer》——14、链表中倒数第 K 个结点

    技术2022-07-11  125

    1. 本题知识点

    双指针

    2. 题目描述

    输入一个链表,输出该链表中倒数第 k 个结点。

    3. 解题思路

    设置两个指针 P1 和 P2,让它们都指向链表第一个结点

    先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。(假设 K = 3,N = 5)

    然后让 P1 和 P2 同时移动,当 P1 移动到链表结尾时,P2 移动到第 N - K 个结点处,该位置就是倒数第 K 个结点。

    4.代码

    public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class Solution { /** * 输入一个链表,输出该链表中倒数第 k 个结点。 * * @param head * @param k * @return */ public ListNode FindKthToTail(ListNode head, int k) { // 如果链表为空,返回 null if (head == null) { return null; } ListNode p1 = head; ListNode p2 = head; // 让 p1 移动 k 个节点 while (k > 0 && p1 != null) { p1 = p1.next; k--; } // 如果没有倒数第 k 个结点,返回 null if (k > 0) { return null; } // 让 p1 和 p2 同时移动,直到 p1 移动到链表结尾 while (p1 != null) { p1 = p1.next; p2 = p2.next; } // 返回 p2,它就是倒数第 k 个节点。 return p2; } }
    Processed: 0.012, SQL: 9