最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教你如何輕松學(xué)會(huì)Java快慢指針?lè)?/h1>
 更新時(shí)間:2021年06月01日 16:25:49   作者:Java全棧研發(fā)大聯(lián)盟  
要想把搬磚的效率提高,我們肯定是逃不掉數(shù)據(jù)結(jié)構(gòu)和算法知識(shí)的,這不,可愛(ài)的小編今天就和大家一起學(xué)習(xí)來(lái)了,今天給大家分享的是快慢指針,那啥是快慢指針呢,文中有非常詳細(xì)的解釋,需要的朋友可以參考下

一、什么是快慢指針?

快慢指針就是定義兩根指針,移動(dòng)的速度一快一慢,以此來(lái)制造出自己想要的差值。這個(gè)差值可以讓我們找到鏈表上相應(yīng)的節(jié)點(diǎn)。

那快慢指針可以解決哪些實(shí)際問(wèn)題呢,接下來(lái)我們一起看看吧!

二、使用快慢指針來(lái)找到鏈表的中點(diǎn)

1.首先我們?cè)O(shè)置兩個(gè)指針slow和fast,這2個(gè)指針的初始位置相同,都指向鏈表的頭結(jié)點(diǎn),然后slow指針每次移動(dòng)一步,fast指針每次移動(dòng)兩步;

2.如果鏈表中節(jié)點(diǎn)個(gè)數(shù)為偶數(shù)時(shí),當(dāng)快指針無(wú)法繼續(xù)移動(dòng)時(shí),慢指針剛好指向中點(diǎn);如果鏈表中節(jié)點(diǎn)個(gè)數(shù)為奇數(shù)時(shí),當(dāng)快指針走完,慢指針指向中點(diǎn)的前一個(gè)節(jié)點(diǎn)。

public ListNode reverseStore(ListNode head) {
        // 初始化,讓快指針和慢指針都處于鏈表的頭部
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null&&fast.next!=null){//如果快指針并且下一個(gè)不為空
            fast=fast.next.next;//快指針移動(dòng)兩個(gè)
            slow=slow.next;//慢指針移動(dòng)一個(gè)       
        }
        return slow;
  }

三、利用快慢指針來(lái)判斷鏈表中是否有環(huán)

問(wèn)題描述: 給定一個(gè)鏈表,判斷鏈表中是否有環(huán)。

以下兩種情況都屬于鏈表中存在環(huán),“0”字型和“6”字型

這個(gè)時(shí)候我們的解決方案就是利用“快慢指針”, 慢指針針每次走一步,快指針每次走兩步,如果相遇就說(shuō)明有環(huán),如果有一個(gè)為空說(shuō)明沒(méi)有環(huán)。代碼比較簡(jiǎn)單  (在代碼下面會(huì)專(zhuān)門(mén)講解思路的,放心!)

public boolean hasCycle(ListNode head) {
     if (head == null)
        return false;
     //快慢兩個(gè)指針,初始時(shí)都指向鏈表的頭結(jié)點(diǎn)
     ListNode slow = head;
     ListNode fast = head;
     while (fast != null && fast.next != null) {
         //慢指針每次走一步
         slow = slow.next;
        //快指針每次走兩步
        fast = fast.next.next;
        //如果相遇,說(shuō)明有環(huán),直接返回true
        if (slow == fast)
           return true;
    }
    //否則就是沒(méi)環(huán)
    return false;
}

到這里大家可能就有疑問(wèn)了,為什么快慢指針就一定能判斷是否有環(huán)。我們可以這樣來(lái)思考一下,假如有環(huán),那么快慢指針最終都會(huì)走到環(huán)上,假如環(huán)的長(zhǎng)度是m,快慢指針最近的間距是n,如下圖中所示

下面說(shuō)的兩點(diǎn)相距是指 “快指針還需要多遠(yuǎn)可以再次追到慢指針”

快指針每次走兩步,慢指針每次走一步,所以每走一次快慢指針的間距就要縮小一步,在圖一中當(dāng)走n次的時(shí)候就會(huì)相遇,在圖二中當(dāng)走m-n次的時(shí)候就會(huì)相遇。這樣就解釋清楚了讀者的疑問(wèn)了。

四、刪除鏈表的倒數(shù)第n個(gè)節(jié)點(diǎn)

問(wèn)題描述:刪除倒數(shù)第n個(gè)節(jié)點(diǎn),那就等于是要我們先找出待刪除元素前一個(gè)元素,也就是第n-1個(gè)節(jié)點(diǎn)。聰明的你肯定發(fā)現(xiàn)了,我們又把這個(gè)問(wèn)題轉(zhuǎn)化為找鏈表上的某個(gè)節(jié)點(diǎn)的問(wèn)題了,這是快慢指針最擅長(zhǎng)的場(chǎng)景。

思路很簡(jiǎn)單,我們一開(kāi)始就讓fast指針比slow指針快n+1個(gè)元素,接下來(lái),兩個(gè)指針都是一步一步來(lái)往下走。那么當(dāng)fast指針走完時(shí),slow指針就剛剛好停留在第(n-1)個(gè)元素上。

//刪除鏈表倒數(shù)第n個(gè)節(jié)點(diǎn)
public ListNode removeBackEndNode(ListNode head, int n) {
        if (head == null || head.next == null) {
            return null;
        }
​
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
       //初始時(shí)讓快慢指針都指向鏈表的頭部
        ListNode slow = dummyHead;
        ListNode fast = dummyHead;
​
        for (int i = 0; i < n + 1; i++) {
            fast = fast.next;
        }
​
        while (fast != null) {
            slow = slow.next;
            fast = fast.next;
        }
​
        slow.next = slow.next.next;  //為了解決斷鏈問(wèn)題
​
        return dummyHead.next;
    }

五、判斷是否是回文鏈表

快指針每次前進(jìn)兩個(gè)單位,慢指針每次前進(jìn)一個(gè)單位并修改其next節(jié)點(diǎn)指向前一個(gè)節(jié)點(diǎn),所以當(dāng)快指針到達(dá)鏈表末尾的時(shí)候(空節(jié)點(diǎn)或空節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)),慢指針剛好在中間,如下圖所示

此時(shí)慢指針繼續(xù)向后走,同時(shí)開(kāi)辟一個(gè)新節(jié)點(diǎn)往前走,看下圖

判斷鏈表中點(diǎn)前后是否相同,達(dá)到判斷回文串的目的,如下圖所示

代碼如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null){
            return true;
        }
​
        ListNode pre = null;//指向前一個(gè)節(jié)點(diǎn)的指針
        ListNode slow = head;//慢指針
        ListNode fast = head;//快指針
​
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            ListNode next = slow.next;
            slow.next = pre;//修改慢指針走過(guò)的節(jié)點(diǎn)指向前一個(gè)節(jié)點(diǎn)
            pre = slow;
            slow = next;
        }
        if(fast != null){
            slow = slow.next;
            //當(dāng)長(zhǎng)度為奇數(shù)是,慢指針需要再走一個(gè)單位
        }
        while(pre!=null) {
            //判斷是否為回文串
            if(pre.val!=slow.val){
                return false;
            }
            pre = pre.next;
            slow = slow.next;
        }
        return true;
    }
}

到此這篇關(guān)于教你如何輕松學(xué)會(huì)Java快慢指針?lè)ǖ奈恼戮徒榻B到這了,更多相關(guān)Java快慢指針?lè)▋?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • jsoup如何爬取圖片到本地

    jsoup如何爬取圖片到本地

    這篇文章主要為大家詳細(xì)介紹了jsoup如何爬取圖片到本地,jsoup爬取網(wǎng)站信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Knife4j?3.0.3?整合SpringBoot?2.6.4的詳細(xì)過(guò)程

    Knife4j?3.0.3?整合SpringBoot?2.6.4的詳細(xì)過(guò)程

    本文要講的是?Knife4j?3.0.3?整合SpringBoot?2.6.4,在SpringBoot?2.4以上的版本和之前的版本還是不一樣的,這個(gè)也容易導(dǎo)致一些問(wèn)題,本文就這兩個(gè)版本的整合做一個(gè)實(shí)戰(zhàn)介紹
    2022-09-09
  • SpringBoot集成MinIO的示例代碼

    SpringBoot集成MinIO的示例代碼

    對(duì)象存儲(chǔ)服務(wù)OSS是一種海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),適合存放任意類(lèi)型的文件,這篇文章主要介紹了SpringBoot集成MinIO的示例代碼,需要的朋友可以參考下
    2023-06-06
  • Mybatis查詢Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類(lèi)上的問(wèn)題解決

    Mybatis查詢Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類(lèi)上的問(wèn)題解決

    使用mybatis查詢表數(shù)據(jù)得時(shí)候,發(fā)現(xiàn)對(duì)應(yīng)得實(shí)體類(lèi)字段好多都是null,本文主要介紹了Mybatis查詢Sql結(jié)果未映射到對(duì)應(yīng)得實(shí)體類(lèi)上的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • IDEA JAVA項(xiàng)目熱加載的實(shí)現(xiàn)步驟

    IDEA JAVA項(xiàng)目熱加載的實(shí)現(xiàn)步驟

    熱加載可以使代碼修改后無(wú)須重啟服務(wù)器,就可以加載更改的代碼,本文主要介紹了IDEA JAVA項(xiàng)目熱加載的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-06-06
  • 基于logback實(shí)現(xiàn)純java版本的SDK組件

    基于logback實(shí)現(xiàn)純java版本的SDK組件

    這篇文章主要介紹了基于logback實(shí)現(xiàn)純java版本的SDK組件,在項(xiàng)目開(kāi)發(fā)過(guò)程中通常會(huì)使用logback作為日志記錄的依賴工具,使用方式是引入logback相關(guān)jar包,然后配置logback.xml配置文件的方式來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2023-11-11
  • Spring Retry重試框架的使用講解

    Spring Retry重試框架的使用講解

    重試的使用場(chǎng)景比較多,比如調(diào)用遠(yuǎn)程服務(wù)時(shí),由于網(wǎng)絡(luò)或者服務(wù)端響應(yīng)慢導(dǎo)致調(diào)用超時(shí),此時(shí)可以多重試幾次。用定時(shí)任務(wù)也可以實(shí)現(xiàn)重試的效果,但比較麻煩,用Spring Retry的話一個(gè)注解搞定所有,感興趣的可以了解一下
    2023-01-01
  • Java獲取磁盤(pán)分區(qū)信息的示例詳解

    Java獲取磁盤(pán)分區(qū)信息的示例詳解

    在日常開(kāi)發(fā)、系統(tǒng)監(jiān)控和資源管理中,磁盤(pán)分區(qū)信息是非常重要的數(shù)據(jù),本文將基于 Java 語(yǔ)言實(shí)現(xiàn)磁盤(pán)分區(qū)信息的獲取功能,感興趣的可以了解下
    2025-03-03
  • Java countDownLatch如何實(shí)現(xiàn)多線程任務(wù)阻塞等待

    Java countDownLatch如何實(shí)現(xiàn)多線程任務(wù)阻塞等待

    這篇文章主要介紹了Java countDownLatch如何實(shí)現(xiàn)多線程任務(wù)阻塞等待,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中批處理框架spring batch詳細(xì)介紹

    Java中批處理框架spring batch詳細(xì)介紹

    這篇文章主要介紹了Java中批處理框架spring batch詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

信丰县| 威海市| 偃师市| 道孚县| 城固县| 会东县| 兴隆县| 益阳市| 永新县| 库车县| 中卫市| 保定市| 新绛县| 灵璧县| 六枝特区| 重庆市| 武邑县| 西贡区| 历史| 溧水县| 绩溪县| 如皋市| 临潭县| 安化县| 克东县| 迁安市| 乌审旗| 搜索| 临漳县| 托克托县| 达孜县| 宿迁市| 上饶市| 昌黎县| 肇州县| 北宁市| 图们市| 利津县| 闵行区| 丁青县| 蓬莱市|