環形鏈表詳解(讓你徹底理解環形鏈表)

文章目錄

  • 一.什么是環形鏈表?
  • 二.環形鏈表的例題(力扣)
  • 三.環形鏈表的延伸問題

  • 補充

一.什么是環形鏈表?

環形鏈表是一種特殊類型的鏈表數據結構,其最后一個節點的"下一個"指針指向鏈表中的某個節點,形成一個閉環。 換句話說,鏈表的最后一個節點連接到了鏈表中的某個中間節點,而不是通常情況下連接到空指針 (null)

二.環形鏈表的例題(力扣)

給你一個鏈表的頭節點?head?,判斷鏈表中是否有環。

如果鏈表中有某個節點,可以通過連續跟蹤?next?指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數?pos?來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。注意:pos?不作為參數進行傳遞?。僅僅是為了標識鏈表的實際情況。

如果鏈表中存在環?,則返回?true?。 否則,返回?false?。

輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。

這個題目,我們的做法是快慢指針思想,先設置fast和slow兩個指針指向鏈表的開始,慢的一次走一步,快的一次走兩步,如果不帶環,fast的就為空,如果帶環,fast就會在環里追上slow。我們來畫圖來看他的情況。

就是這4種情況,然后寫代碼就可以了,這個并不難 。

bool hasCycle(struct ListNode* head) 
{struct ListNode* slow = head, * fast = head;while (fast && fast->next)//存在奇偶{slow = slow->next;fast = fast->next->next;if (slow == fast)//相交就是環{return true;}}return false;
}

三.環形鏈表的延伸問題

1.為什么fast和slow一定會在環里相遇會不會在還里面錯過或者永遠追不上?

2.為什么一定是slow走一步fast走兩步?難道不能slow一步fast走其他步數?

3.如何去求入環口的節點呢?

3.1.為什么fast和slow一定會在環里相遇會不會在還里面錯過或者永遠追不上?

slow和fast一定是fast先入環,這時候slow走了入環前距離的一半,隨著slow進環,fast已經在環里走了一段距離了,走的多少和環的大小是有關系的,我們假設slow進環的時候離fast距離為N快的開始追慢的,慢的,每次走一步快的每次走兩步就相當于追y一步,所以說他的距離變化是N,N-1,N-2。。。1,0,他們之間的距離為零時就是相遇點,所以說一定追得上。

3.2為什么一定是slow走一步fast走兩步?難道不能slow一步fast走其他步數?

假設slow一步,fast3步,slow近環之后,他們的距離為N,則他們的距離變化為當N為偶數是N,N-2,N-4…..0,2。可以追得上,但是N為奇數的時候N的變化為N,N-2,N-4..1,-1。如果因為奇數距離為-1意味著他們之間的距離變成了c-1(c是環的長度),那么就要重新追,但是你重新追的話你就需要判斷c-1他是不是二的倍數,如果它是的話就可以追上不是的話就追不上

在假設slow一步,fast4步,追3步,其實也是一樣的,如果N是3的倍數就可以追上,但是N不是3的倍數的話,就要看,有兩種情況,一種是N,N-3,N-6..2,-1。一種為N,N-3,N-6..1,-2。根據之前的結論,如c-1和c-2是3的倍數的話就可以追上

3.3如何去求入環口的節點呢?

先說結論:一個指針從相遇點開始走一個指針,從鏈表頭開始走,他們會在環的入口點相遇。

追上的相遇的過程中,慢指針的距離:L+X,快指針的距離:L+NC+X,因為你不知道fast在環里多跑了幾圈,所以設了一個N,但是N肯定>=1,又因為fast是slow的兩倍,所以2(L+X)=L+NC+X。整理可得L=(N-1)X+C-X,(N-1)X就是從meetNode開始又走到meetNode的距離,C-X就是從相遇點到入口點的距離,結論得證。

struct ListNode* deCycle(struct ListNode* head)
{struct ListNode* slow = head, * fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;//相遇了if (slow == fast){struct ListNode* meet = slow;//由公式得證while (meet != head){meet = meet->next;head = head->next;}return meet;}}return NULL;}


補充

其實求入口點還有一種方法就是在入口點處,直接指向空指針,把它看作一個相交鏈表來做,由頭節點和相遇點之前的那個節點,然后兩個節點找相交點就可以了。

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

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

相關文章

Python 教學平臺,支持“多班教學”的課程授課方式|ModelWhale 版本更新

龍行龘龘、前程朤朤,ModelWhale 新一輪的版本更新,期待為大家帶來更優質的使用體驗。 本次更新中,ModelWhale 主要進行了以下功能迭代: 新增 課程(包括課件、作業、算力)按班級管理(團隊版? …

springcloud的搭建和封裝,已進行開源,相互學習代碼知識。

springcloud架構的統一父工程,(管理子模塊,管理依賴插件,依賴版本等) abillty:能力服務塊:存放一些非業務相關的微服務,比如網關,身份認證等 exce: 網關中的一些異常信息處理 gatewa…

基于Springboot的人事管理系統 (有報告)。Javaee項目,springboot項目。

演示視頻: 基于Springboot的人事管理系統 (有報告)。Javaee項目,springboot項目。 項目介紹: 采用M(model)V(view)C(controller)三層體系結構&am…

【Git】merge時報錯:refusing to merge unrelated histories

文章目錄 一、問題二、解決辦法1、將feature分支的東西追加到master分支中2、將feature里的東西直接覆蓋到master分支中 一、問題 今天將feature分支合并到master時報錯:refusing to merge unrelated histories(拒絕合并無關歷史) 報錯原因&…

一篇文章速通static關鍵字(JAVA)

目錄 1.原理——內存機制 1.1 修飾對象 1.2 lifecycle生命周期 2. 靜態屬性(類屬性)和實例屬性(對象屬性) 2.1 定義方式 2.2 調用方法 3. 靜態方法和屬性 3.1 在同一個類中 3.2 在不同類中 4.總結(關鍵&#x…

SQLSyntaxEProrException異常產生原因及解決方案

java.sq1.SQLSyntaxEProrException異常產生原因及解決方案 01 異常的發生場景 在我mybatis-plus寫了一個查詢接口后出現的問題 java.sq1.SQLSyntaxEProrException日志報錯的意思是sql語法問題 02 異常的產生及其原因 我最開始又認為是MySQL數據庫表設計的問題&#xff0c…

ROS2從入門到精通:理論與實戰

ROS是什么? 隨著人工智能技術的飛速發展與進步,機器人的智能化已經成為現代機器人發展的終極目標。機器人發展的速度在不斷提升,應用范圍也在不斷拓展,例如自動駕駛、移動機器人、操作機器人、信息機器人等。機器人系統是很多復雜…

外貿福利 PHP源碼 WhatsApp 營銷 - 批量發件人、聊天、機器人、SaaS 搭建

WhatsApp 營銷工具對于外貿人員來說至關重要。隨著全球貿易的不斷發展,WhatsApp已成為了許多國際貿易商之間溝通的首選工具之一。通過利用WhatsApp營銷工具,外貿人員可以輕松地與客戶建立聯系,傳遞產品信息,進行價格談判&#xff…

Revit-二開之東西南北立面FilledRegion的CurveLoop計算-(4)

東西南北FilledRegion的CurveLoop計算 上一篇以東立面視圖為例創建FilledRegion,接下來我們將立面視圖創建FilledRegion的CurveLoop匯總一下。 上圖是對四個立面坐標系間的繪制方便我們計算FilledRegion的CurveLoop。 東立面CurveLoop計算 private CurveLoop GetEastCurveL…

3.1網安學習第三階段第一周回顧(個人學習記錄使用)

本周重點 ①HTML/JavaScript/CSS ②PHP ③正則表達式/文件上傳/文件讀寫 ④AJAX不跳轉提交 ⑤ OOP面向對象編程 本周主要內容 DAY1 HTML/JavaScript/CSS ①HTML 一、基本結構 <HTML> <head> //頭部內容 <title>網頁標題</title> </head&…

內網滲透-DC-9靶機滲透

攻擊機&#xff1a;kali 192.168.236.137 目標機&#xff1a;dc-9 192.168.236.138 一、信息收集 1.使用arp-scan -l和nmap進行主機發現和端口信息收集 nmap -sS -T5 --min-rate 10000 192.168.236.138 -sC -p- 發現22端口被阻塞 2.whatweb收集一下cms指紋信息 what http…

Vue開發實例(七)Axios的安裝與使用

說明&#xff1a; 如果只是在前端&#xff0c;axios常常需要結合mockjs使用&#xff0c;如果是前后端分離&#xff0c;就需要調用對應的接口&#xff0c;獲取參數&#xff0c;傳遞參數&#xff1b;由于此文章只涉及前端&#xff0c;所以我們需要結合mockjs使用&#xff1b;由于…

《熱辣滾燙》:用堅持不懈開啟逆境中的職場出路

"你只活一次&#xff0c;所以被嘲笑也沒有關系&#xff0c;想哭也沒有關系&#xff0c;失敗更沒有關系。" “人生就像一場拳擊賽&#xff0c;你站不起來&#xff0c;就永遠不知道自己有多強” “命運只負責洗牌&#xff0c;出牌的永遠是自己。” 在今年的賀歲檔電影市…

云時代【6】—— 鏡像 與 容器

云時代【6】—— 鏡像 與 容器 四、Docker&#xff08;三&#xff09;鏡像 與 容器1. 鏡像&#xff08;1&#xff09;定義&#xff08;2&#xff09;相關指令&#xff08;3&#xff09;實戰演習鏡像容器基本操作離線遷移鏡像鏡像的壓縮與共享 2. 容器&#xff08;1&#xff09;…

為什么模電這么難學?這是我見過最好的回答

大家好&#xff0c;我是磚一&#xff0c;有很多人抱怨模電難學&#xff0c;被譽為電子信息掛科率最高之一&#xff0c;下面聽我分析一下為啥模電這么難學&#xff1f; 01 理科的抽象思維 在高等教育體系中&#xff0c;模電是涉及半導體方向的第一門工程類課程&#xff0c;是一…

2024年3月5-7日年生物發酵裝備展-環科環保科技

參展企業介紹 山東環科環保科技有限公司,是一家集環保設備的設計、制造、安裝、服務及環境治理工程總承包于一體的企業。 公司長期專注于大氣、水、危固廢三大領域&#xff0c;以科技創造碧水藍天&#xff0c;為客戶提供環保解決方案。 以穩定的產品及服務質量、適用的技術、…

【環境搭建】linux centos7安裝mosquitto消息代理軟件操作步驟以及遇到問題日常記錄

最近需要用到mqtt&#xff0c; 選擇安裝mosquitto。由于安裝mosquitto花了我一點時間&#xff0c;簡單記錄下。安裝環境是linux centos7&#xff0c; 其他像windows、mac或者ubuntu 參考下 https://mosquitto.org/download/ 英文官網&#xff0c;或者別人寫的文章。 服務器…

微型世界:嵌入式科技的無限可能

微型世界&#xff1a;嵌入式科技的無限可能 1. 嵌入式科技的定義與特點 定義&#xff1a;嵌入式科技是一種特殊的計算機系統&#xff0c;通常用于特定的應用領域&#xff0c;如智能手機、智能家居設備等。特點&#xff1a;小巧、低功耗、高效率、實時性強、可靠性高、成本較低…

洛谷題單_搜索

P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) #include <bits/stdc.h> using namespace std; const int N14; int n,ans0; int a[N][N]{},vis[N][N]{}; vector<int>rcd(n1); void dfs(int dep){if(depn1){if(ans<…

有道QAnything背后的故事---關于RAG的一點經驗分享

近日&#xff0c;我們開源了有道自研的RAG&#xff08;Retrieval Augmented Generation) 引擎QAnything。該引擎允許用戶上傳PDF、圖片、Word、Excel、PowerPoint等多種格式的文檔&#xff0c;并實現類似于ChatGPT的互動問答功能&#xff0c;其中每個答案都能精確追溯到相應的文…