链表中倒数最后k个结点-牛客BM8-使用双指针来解决

链表中倒数最后k个结点-使用双指针来解决

题目:

在这里插入图片描述

解题思路:

  • 定义两个指针:
    • 第一个指针 表示要返回的k个节点的第一个节点,该节点可被称作结果节点即该题的结果

    • 第二个指针,表示要要返回的k个节点的最后一个节点,该节点可被称作探索节点

  • 一开始先让 探索节点 跑(K-1)次即到k个节点中的最后一个,若该链表跑不了7次,则表示该链表返回不了K个节点
  • 此时保证了从结果节点到探索节点一共有7个元素,然后让探索节点,结果节点同时跑,当探索节点的next为null时,此时探索节点表示k个最后一个结果节点表示k个的第一个
  • 最后返回结果节点
  • 因此该题的时间复杂为O(n),空间复杂度为O(1)

代码

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pHead ListNode类
     * @param k int整型
     * @return ListNode类
     */
    public ListNode FindKthToTail (ListNode pHead, int k) {
        //临界情况
        if(pHead == null) return null;
        if(k == 0) return null;
        //定义两个指针:第一个指针 表示要返回的k个节点的第一个节点,该节点可被称作结果节点,即该题的结果
        //             第二个指针,表示要要返回的k个节点的最后一个节点,该节点可被称作探索节点
        //一开始先让 探索节点 跑(K-1)次即到k个节点中的最后一个,若该链表跑不了7次,则表示该链表返回不了K个节点
        //然后让探索节点,结果节点同时跑,当探索节点的next为null时,此时探索节点表示k个最后一个,结果节点表示k个的第一个
        //最后返回结果节点
        //因此该题的时间复杂为O(n),空间复杂度为O(1)
        ListNode resultNode = pHead;
        ListNode exploreNde = findStartExploreNode(resultNode, k);

        //说明该链表没有7个节点
        if (exploreNde == null) return null;

        //结果节点和探索节点同时跑,直至探索节点的next位null时,返回结果节点
        while (exploreNde.next != null) {
            resultNode = resultNode.next;
            exploreNde = exploreNde.next;
        }
        return resultNode;
    }

    private ListNode findStartExploreNode(ListNode resultNode, int k) {
        ListNode exploreNde = resultNode;
        //循环k-1次,找到k个节点的最后一个节点的位置
        for (int i = 0; i < (k - 1); i++ ) {
            if (exploreNde == null)  return null;
            exploreNde = exploreNde.next;
        }
        return exploreNde;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值