算法练习-第四天(链表中倒数最后k个结点)

Posted 旷世奇才李先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法练习-第四天(链表中倒数最后k个结点)相关的知识,希望对你有一定的参考价值。

不要再因为那些你不能控制的事情有压力了,要专注于你能控制的事情
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

👏👏👏
哈喽!大家好,首先将我的刷题神器分享出来,点此注册
😍😍😍

文章目录


前言

对于程序员来说算法属于基本功,掌握了算法就能够写出更高效的代码,所以一个好的练习算法的网站尤为重要,现在分享一下我经常刷算法题的网站,上面不仅有算法题,还有其他类型的题,赶紧刷起来吧,算法神器

一、链表中倒数最后k个结点

二、题解

import java.util.*;
public class Solution 
    public ListNode FindKthToTail (ListNode pHead, int k) 
        int n = 0;
        ListNode fast = pHead; 
        ListNode slow = pHead;
        //快指针先行k步
        for(int i = 0; i < k; i++)  
            if(fast != null)
                fast = fast.next;
            //达不到k步说明链表过短,没有倒数k
            else 
                return slow = null;
        
        //快慢指针同步,快指针先到底,慢指针指向倒数第k个
        while(fast != null) 
            fast = fast.next;
            slow = slow.next;
        
        return slow;
    


三、分析

1、解决方式(双指针)

双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是同方向访问一个链表(快慢指针)、或是相反方向扫描(对撞指针),从而达到我们需要的目的。

思路:

我们无法逆序遍历链表,就很难得到链表的倒数第kkk个元素,那我们可以试试反过来考虑,如果当前我们处于倒数第kkk的位置上,即距离链表尾的距离是kkk,那我们假设双指针指向这两个位置,二者同步向前移动,当前面个指针到了链表头的时候,两个指针之间的距离还是kkk。虽然我们没有办法让指针逆向移动,但是我们刚刚这个思路却可以正向实施。

具体做法:

step 1:准备一个快指针,从链表头开始,在链表上先走kkk步。
step 2:准备慢指针指向原始链表头,代表当前元素,则慢指针与快指针之间的距离一直都是kkk。
step 3:快慢指针同步移动,当快指针到达链表尾部的时候,慢指针正好到了倒数kkk个元素的位置。

如下图所示:



2、测试提交

代码写完了就需要先自测一下,这个时候我们点击自测运行看一看能不能测试通过。

这里我们可以看到自测成功了,那我们就点击保存并提交来提交此题。


提交答案后会显示我们此题的运行时间以及占用内存,并且判断我们这两项超过了其他百分之多少的人,我们还可以点击进入下一题来接着进行刷题,这样会越刷越上瘾的。

四、总结

通过这个刷题神器刷题是真的过瘾,通过画图的方式将每一行代码分析出来就不会觉得代码难以理解了,所以赶紧刷起来吧,点此注册

可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

以上是关于算法练习-第四天(链表中倒数最后k个结点)的主要内容,如果未能解决你的问题,请参考以下文章

算法练习-第四天(链表中倒数最后k个结点)

牛客网高频算法题系列-BM8-链表中倒数最后k个结点

算法入门10链表中倒数第k个结点

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

[算法]在单链表和双链表中删除倒数第k个结点

链表中倒数第K个结点