鏈表的面試題8之環形鏈表

許久不見,那么這是最后倒數第三題了,這道題我們來看一下環形鏈表。

老規矩貼鏈接:141. 環形鏈表 - 力扣(LeetCode)

目錄

倒數第k個元素

獲取中間元素的問題。

雙指針


來,大致看一下題目,這道題目需要我們做什么??需要我們去判斷,這個鏈表內存不存在環,那我們比較的是什么?比較值肯定是不行,那我們發現,能不能在遍歷到一定程度以后,讓這個節點的指針域等于我們之前遍歷過的節點的指針域。那我們發現我們遍歷是存儲不了數據的。那么思路就卡死了。

無法高效獲取長度,無法根據偏移快速訪問元素,是鏈表的兩個劣勢。然而面試的時候經常碰見諸如獲取倒數第k個元素,獲取中間位置的元素,判斷鏈表是否存在環,判斷環的長度等和長度與位置有關的問題。這些問題都可以通過靈活運用雙指針來解決。

當然雙指針是一種思維,而不是一個公式。這一點需要讀者謹記。

直接從雙指針開始講起會顯得很云里霧里,所以我們這里鋪墊兩道題目來穿插這里的思想。對于鏈表的長度和偏移量的操作需要慎之又慎。

倒數第k個元素

先來看"倒數第k個元素的問題"。設有兩個指針 p 和 q,初始時均指向頭結點。首先,先讓 p 沿著 next 移動 k 次。此時,p 指向第 k+1個結點,q 指向頭節點,兩個指針的距離為 k 。然后,同時移動 p 和 q,直到 p 指向空,此時 q 即指向倒數第 k 個結點。可以參考下圖來理解:

這里就是固定兩人的思想,講的比較感性一點就像兩人推進,前一個人推進結果踩空了之后,那么后一個人就已經知道自己所在位置是對的了。代碼放在下面供大家參考。

class Solution {
public:ListNode* getKthFromEnd(ListNode* head, int k) {ListNode *p = head, *q = head; //初始化while(k--) {   //將 p指針移動 k 次p = p->next;}while(p != nullptr) {//同時移動,直到 p == nullptrp = p->next;q = q->next;}return q;}
};

獲取中間元素的問題。

設有兩個指針 fast 和 slow,初始時指向頭節點。每次移動時,fast向后走兩次,slow向后走一次,直到 fast 無法向后走兩次。這使得在每輪移動之后。fast 和 slow 的距離就會增加一。設鏈表有 n 個元素,那么最多移動 n/2 輪。當 n 為奇數時,slow 恰好指向中間結點,當 n 為 偶數時,slow 恰好指向中間兩個結點的靠前一個(可以考慮下如何使其指向后一個結點呢?)

跟上面不一樣的是,這里改變的是兩個指針的跨度。那么到底怎么讓偶數的時候讓他指向往后一個節點呢?一種簡單的方法是在?fast?無法移動兩步時,讓?slow?再移動一步。這樣,slow?將從中間兩個節點的前一個節點移動到后一個節點。?下述代碼實現了 n 為偶數時慢指針指向靠后結點。

class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode *p = head, *q = head;while(q != nullptr && q->next != nullptr) {p = p->next;q = q->next->next;}return p;} 
};

雙指針

那我們再回來看我們卡在了哪里。

我們在開頭的時候為什么卡住了?因為我們想的是單指針的循環遍歷問題,考慮遍歷后的節點指針域如何儲存,或者是再次讀取。

那么根據上一個引題我們來總結快慢指針的特性 —— 每輪移動之后兩者的距離會加一。??

下面會繼續用該特性解決環的問題。
當一個鏈表有環時,快慢指針都會陷入環中進行無限次移動,然后變成了追及問題。想象一下在操場跑步的場景,只要一直跑下去,快的總會追上慢的。當兩個指針都進入環后,每輪移動使得慢指針到快指針的距離增加一,同時快指針到慢指針的距離也減少一,只要一直移動下去,快指針總會追上慢指針。也就是說,套圈了唄!

哈哈,我找了一張很清楚的動圖來給大家演示,根據上述表述得出,如果一個鏈表存在環,那么快慢指針必然會相遇!!!

所以這里再重新提出來兩個問題:

1.為什么快指針每次走兩步,慢指針走一步可以?

假設鏈表帶環,兩個指針最后都會進入環,快指針先進環,慢指針后進環。當慢指針剛進環時,可
能就和快指針相遇了,最差情況下兩個指針之間的距離剛好就是環的長度。此時,兩個指針每移動
一次,之間的距離就縮小一步,不會出現每次剛好是套圈的情況,因此:在滿指針走到一圈之前,
快指針肯定是可以追上慢指針的,即相遇。

2.快指針一次走3步,走4步,...n步行嗎?

最后貼一下代碼

class Solution {
public:bool hasCycle(ListNode *head) {ListNode *slow = head;ListNode *fast = head;while(fast != nullptr) {fast = fast->next;if(fast != nullptr) {fast = fast->next;}if(fast == slow) {return true;}slow = slow->next;}return nullptr;}
};

好了,這道題就講到這里

如果你覺得對你有幫助,可以點贊關注加收藏,感謝您的閱讀,我們下一篇文章再見。

一步步來,總會學會的,首先要懂思路,才能有東西寫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 JavaScript 中正確使用 Elasticsearch,第二部分

作者:來自 Elastic Jeffrey Rengifo 回顧生產環境中的最佳實踐,并講解如何在無服務器環境中運行 Elasticsearch Node.js 客戶端。 想獲得 Elastic 認證?查看下一期 Elasticsearch Engineer 培訓的時間! Elasticsearch 擁有大量新…

2025年網站安全防御全解析:應對DDoS與CC攻擊的智能策略

2025年,隨著AI技術與物聯網設備的深度融合,DDoS與CC攻擊的規模與復雜度持續升級。攻擊者不僅利用T級流量洪泛沖擊帶寬,還通過生成式AI偽造用戶行為,繞過傳統防御規則。如何在保障業務高可用的同時抵御混合型攻擊?本文將…

window 安裝 wsl + cuda + Docker

WSL 部分參考這里安裝: Windows安裝WSL2 Ubuntu環境 - 知乎 如果出現錯誤: WslRegisterDistribution failed with error: 0x800701bc 需要運行:https://crayon-shin-chan.blog.csdn.net/article/details/122994190 wsl --update wsl --shu…

《MambaLLIE:基于隱式Retinex感知的低光照增強框架與全局-局部狀態空間建模》學習筆記

Paper:2405.16105 Github:GitHub - wengjiangwei/MambaLLIE 目錄 摘要 一、介紹 二、相關工作 2.1 低光圖像增強 2.2 視覺空間狀態模型 三、方法 3.1 預備知識 3.2 整體流程 3.3 全局優先-局部次之狀態空間塊 四、實驗 4.1 基準數據集與實施細節 4.2 對比實驗 4…

微信小程序:封裝request請求、解決請求路徑問題

一、創建文件 1、創建請求文件 創建工具類文件request.js,目的是用于發送請求 二、js接口封裝 1、寫入接口路徑 創建一個變量BASE_URL專門存儲api請求地址 2、獲取全局的token變量 從緩存中取出token的數據 3、執行請求 (1)方法中接收傳遞的參數 function request(url,…

【單機版OCR】清華TH-OCR v9.0免費版

今天向大家介紹一款非常好用的單機版OCR圖文識別軟件,它不僅功能多,識別能力強,而且還是免費使用的。OCR軟件為什么要使用單機版,懂得都懂,因為如果使用在線識別的OCR軟件,用戶需要將文檔上傳互聯網服務器的…

開源情報搜集系統:科研創新的強大引擎

一、引言 在當今全球化和信息化高度發展的時代,科研活動面臨著前所未有的機遇與挑戰。一方面,知識的更新換代速度極快,科研成果如雨后春筍般不斷涌現;另一方面,科研競爭日益激烈,如何在眾多科研團隊中脫穎…

產品生命周期不同階段的營銷策略

產品生命周期的不同階段(導入期、成長期、成熟期、衰退期)需要匹配差異化的營銷策略。以下是各階段的營銷重點及具體策略: 1. 導入期(Introduction Stage) 核心目標:建立市場認知,快速觸達目標…

Mujoco 學習系列(二)基礎功能與xml使用

這篇文章是 Mujoco 學習系列第二篇,主要介紹一些基礎功能與 xmI 使用,重點在于如何編寫與讀懂 xml 文件。 運行這篇博客前請先確保正確安裝 Mujoco 并通過了基本功能與GUI的驗證,即至少完整下面這個博客的 第二章節 內容: Mujoc…

面向SDV的在環測試深度解析——仿真中間件SIL KIT應用篇

1.引言 在汽車行業向軟件定義汽車(SDV)轉型的過程中,傳統硬件在環(HIL)測試方案因難以適應新的技術架構與需求,其局限性日益凸顯。傳統HIL對硬件依賴性強,擴展性差,更換ECU或傳感器…

windows使用anaconda安裝pytorch cuda版本

Windows安裝PytorchCUDA環境_使用conda安裝pytorch cuda10.2版本-CSDN博客

Axure中使用動態面板實現圖標拖動交換位置

要在Axure中實現圖標拖動交換位置的功能,可以通過動態面板結合交互事件來實現。 實現步驟 準備圖標元素 將每個圖標轉換為動態面板(方便拖動和交互)。 設置拖動交互 選中圖標動態面板 → 添加“拖動時”交互 → 選擇“移動”當前動態面板&am…

從零開始的嵌入式學習day24

標準IO 頭文件需求&#xff1a; #include <stdio.h>1.fopen和fclose (1)fopen fopen的函數功能是打開一個文件。 首先看看fopen的函數聲明&#xff1a; FILE *fopen(const char *path, const char *mode);第一個參數path是文件地址&#xff0c;傳入的是不可變的字符…

抓包分析工具與流量監控軟件

目錄 一、抓包分析工具&#xff1a;定位問題的“放大鏡” 1.1 工作原理簡述 1.2 主流工具盤點 1.3 抓包的實戰應用 二、流量監控軟件&#xff1a;網絡全景的“雷達系統” 2.1 功能特征 2.2 常用工具概覽 2.3 實戰應用場景 五、結語&#xff1a;深入可見&#xff0c;安…

DRIVEGPT4: 通過大語言模型實現可解釋的端到端自動駕駛

《DriveGPT4: Interpretable End-to-End Autonomous Driving via Large Language Model》 2024年10月發表&#xff0c;來自香港大學、浙江大學、華為和悉尼大學。 多模態大型語言模型&#xff08;MLLM&#xff09;已成為研究界關注的一個突出領域&#xff0c;因為它們擅長處理…

Vue3 Form 表單限制輸入小寫字母、數字和下劃線

方案一&#xff1a;Element Plus 表單驗證 <template><el-form :model"form" :rules"rules" ref"formRef" label-width"120px"><el-form-item label"用戶名" prop"username"><el-input v-m…

23、電網數據管理與智能分析 - 負載預測模擬 - /能源管理組件/grid-data-smart-analysis

76個工業組件庫示例匯總 電網數據管理與智能分析組件 1. 組件概述 本組件旨在模擬一個城市配電網的運行狀態&#xff0c;重點關注數據管理、可視化以及基于模擬數據的智能分析&#xff0c;特別是負載預測功能。用戶可以通過界面交互式地探索電網拓撲、查看節點狀態、控制時間…

單片機復用功能重映射Remap功能

目錄 一、查看“DS5319 stm32f10x中等密度mcu數據手冊&#xff08;英文&#xff09;”手冊 二、查看“RM0008 STM32F10xxx參考手冊&#xff08;中文&#xff09;”手冊 三、重映射&#xff08;Remap&#xff09;功能程序編寫 自己學習過程中容易遺忘的知識點&#xff0c;記錄…

鏈表面試題9之環形鏈表進階

那么上一題我們已經知道了雙指針的變法以及拓展的用法&#xff0c;那么這里我們直接難度升級。 想回去復習的這里放個鏈接&#xff1a;鏈表的面試題8之環形鏈表-CSDN博客 題目鏈接&#xff1a;142. 環形鏈表 II - 力扣&#xff08;LeetCode&#xff09; 我們來看這道題目主要…

游戲引擎學習第299天:改進排序鍵 第二部分

回顧并為當天內容做準備 我們會現場編寫完整的游戲代碼。回顧上周發現自己對游戲中正確的排序規則并沒有清晰的理解。主要原因是我們更擅長三維游戲開發&#xff0c;缺乏二維游戲和二維游戲技術的經驗&#xff0c;對于二維精靈排序、模擬三維效果的最佳方案等沒有太多技巧和經…