數據結構~~帶環鏈表的環開始的節點位置**兩種方法

1.帶環鏈表環開始的位置

(1)上面的這個測試用例使用的是包含了4個節點的帶環鏈表,我們要找的就是鏈表里面的環開始的節點的位置,拿這個測試用例而言,就是2這個節點,從這個節點開始,我們的鏈表就形成了一個環,我們要設計程序說明在普適的情況下面如何找到這個環開始位置的節點;

(2)我們這里的思路和之前的一個判斷鏈表是否存在環的相同的思路,我們的快指針肯定會先進入這個環,慢指針后進入這個環,當慢指針進入環的時候,我們的快指針肯定已經在環里面走了好幾圈了,我們假設慢指針一次走1步,快指針一次走2步,因為在這個過程中快指針每次都比慢指針多走一步,這個時候就一定是可以追上的;

(3)這個題目的解題方法,其實很簡單,但是你可能之前從來沒有考慮過這個問題,就是在環上面快慢指針相遇的地方我們設置為meet指針,在開始的位置,我們設置為head指針(注意這里的head指針是指的最開始的位置,下面的圖里面有表示),這個時候讓meet指針一次走一步,head指針一次走一步,這樣進行下去,他們相遇的地方,就是我們的題目里面要求的環的節點的初始位置;是不是很神奇,你可能會問,一定會在這個環的開始節點的位置相遇嗎,為什么會這么巧?對就是這樣的,一定會相遇的,我們是可以通過數學推演證明出來;

(4)我們利用的等量關系就是快指針走過的路程是慢指針的兩倍(這個并不是題目里面給出的,而是我們自己使用的),我們肯定是要在題目里面進行說明的,代碼表示就是fast=fast->next->next而慢指針則是slow=slow->next這樣表示的就是我們設置的慢指針一次走一步,快指針一次走兩步,我們分別表示出來再相遇的時候兩個指針各自走過的路程,利用快指針的路程==慢指針路程的兩倍進行列式計算,就可以得到一個等量關系,這個等量關系就可以說明meet和head指針相遇的位置就是我們要求的環的初始位置節點;

(5)這個路程的表示還是要使用到這個圖,L表示的是沒有進環之前走過的路程,N表示的就是慢指針進環到這兩個指針相遇走過的路程,我們還是假設這個環上面的節點元素的個數是C,慢指針走過的路程就是進環之前的L加上進環之后的N,快指針走過的路程就是進環之前的L加上(我們假設慢指針進環的時候,快指針已經走過了x圈),x*c還要加上N(這個地方可能比較難以理解,多去領悟吧);

(6)利用快指針走的路程是慢指針2倍,就可以得到L=x*C-N這個表達式,當這個X=1的時候L==C-N那么就是說head指針進環之前的路程恰好可以讓meet指針走過C-N到達環開始節點位置在這個位置相遇,這個我們是可以很直觀的看出來的,但是x等于其他的不是一的數字的時候,好像就不是非常直觀了;

(7)我們對于原來的式子稍加化簡,得到L=(x-1)*C+C-N,這樣的話就是說當head指針走過L路程的時候,我們的meet指針走過x-1圈加上C-N這段路程,兩者還是會在這個環的初始位置相遇的。

(8)具體的代碼如下所示:


下面我們介紹這個題目的第二種方法,因為上面的這個方法雖然簡單,但是似乎不容易想到,因為如果我們是第一次做,我們是很難想到的,下面我們介紹的方法是基于我們之前的相交鏈表實現這個環的頭部位置節點的查找:

就是我們現在是相當于把這個環形從meet這個位置斷開,讓meet->next定義為newhead指針,這個時候meet后面已經沒有東西了,所以我們就要把這個meet->next置空;

這個時候就把這個找環開始位置節點的問題,轉換為求解兩個鏈表的相交節點,這個相交接點恰好是我們想要查找的環形鏈表的開始位置的節點(通過上面的圖片可以清晰的看出來);這兩個鏈表一個就是原本的以head為節點的鏈表,另外的一個就是以我們自己重新進行定義的newhead作為頭部節點的鏈表,我們接下來的工作就是找這兩個鏈表的相交節點;

這個時候我們只需要對于這個程序稍加修改就可以了:修改的地方如下

(1)這個時候我們首先要把meet指針的next節點設置為newhead節點,讓后把這個meet->next置空(這個時候newhead是不會受到影響的,因為就相當于是把meet和后面節點的連接給切斷了)

(2)我們需要把之前的判斷相交節點代碼拷貝過來就可以了,然后在這個函數里面調用求解兩個鏈表相交節點的函數,我們需要傳遞的參數就是head和newhead這兩個作為參數;對于這個相交節點的問題,可以看我之前的這個博客,里面有詳細的介紹;

鏈表-----返回倒數第K個節點&&回文結構的判斷&&相交鏈表-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/binhyun/article/details/138368598?spm=1001.2014.3001.5502(3)detectcycle函數里面,我們也是要進行相應的修改的,就是添加meet節點,定義newhead節點,然后把meet->next置空,最后把這個getintersrctionnode這個函數的返回值作為detectCycle函數的返回值就可以了。

?

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

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

相關文章

【第16章】MyBatis-Spring之SqlSession

文章目錄 前言一、SqlSessionTemplate1. 創建2. 使用3. 批量操作3.1 創建SqlSessionTemplate3.2 service3.3 controller 二、SqlSessionDaoSupport總結 前言 在 MyBatis 中,你可以使用 SqlSessionFactory 來創建 SqlSession。 一旦你獲得一個 session 之后&#xf…

源碼部署EFK

目錄 資源列表 基礎環境 關閉防護墻 關閉內核安全機制 修改主機名 添加hosts映射 一、部署elasticsearch 修改limit限制 部署elasticsearch 修改配置文件 單節點 集群(3臺節點集群為例) 啟動 二、部署filebeat 部署filebeat 添加配置文件 啟動 三、部署kiban…

單點登錄【demo】

前言 2023-07-29 15:44:56 公開發布于 2024-5-22 00:04:56 單點登錄【demo】 以下是 Java 實現單點登錄的示例代碼: 單點登錄(Single Sign-On,SSO)是一種身份認證和授權機制,可以使用戶在多個應用程序或系統之間使…

SQL常用基礎語句(一)-- FGHIJ開頭

GROUP BY GROUP BY語法可以根據給定數據列的每個成員對查詢結果進行分組統計,最終得到一個分組匯總表。在GROUP BY子句后面包含了一個HAVING子句,HAVING類似于WHERE,(唯一的差別是WHERE過濾行,HAVING過濾組&#xff0…

【C/C++筆試練習】TCP、IP廣播、ARP協議、IP路由器、MAC協議、三次握手、TCP/IP、子網劃分年、會抽獎、抄送列表

文章目錄 C/C筆試練習選擇部分(1)TCP(2)IP廣播(3)ARP協議(4)IP路由器(5)MAC協議(6)三次握手(7)TCP/IP&#xf…

PHP在線制作表白網源碼

PHP在線制作表白網源碼,送女友個驚喜吧,無數據庫,上傳就能用,后臺/admin,賬號密碼都是admin 百度網盤:https://pan.baidu.com/s/1rbD2_8IsP9UPLK-cdgEXfA?pwdre59

AWS安全性身份和合規性之Secrets Manager

AWS Secrets Manager是一項AWS托管的服務,用于安全地存儲、管理和輪轉敏感信息,如數據庫密碼、API密鑰、OAuth令牌等。AWS Secrets Manager助您在整個生命周期內輕松管理、檢索和輪換數據庫憑證、API密鑰和其他密鑰。 關鍵詞:集中管理、加密…

sql使用加和進行合并去重并提升速率

背景 有三張表ltd1 、ltd0051和、ltd0011ltd1作為主表,左關聯 ltd0051和ltd0011如果ltd0051有兩條重復數據、td0011有兩條重復數據,左關聯之后就會得到4條,同時ltd0051和ltd0011這兩條數據都是正確,基于主鍵我們需要將兩個相同主鍵…

【全開源】AJAX家政上門服務系統小程序自營+多商家(高級授權)+獨立端

基于FastAdmin和原生微信小程序開發的一款同城預約、上門服務、到店核銷家政系統,用戶端、服務端(高級授權)、門店端(高級授權)各端相互依賴又相互獨立,支持選擇項目、選擇服務人員、選擇門店多種下單方式,支持上門服務和到店核銷兩種服務方式…

深入理解數倉開發(一)數據技術篇之日志采集

前言 今天開始重新回顧電商數倉項目,結合《阿里巴巴大數據之路》和尚硅谷的《劍指大數據——企業級電商數據倉庫項目實戰 精華版》來進行第二次深入理解學習。之前第一次學習數倉,雖然盡量放慢速度力求深入理解,但是不可能一遍掌握&#xff0…

我在去哪兒薅到了5塊錢火車票代金券,速薅

哈哈,親愛的薅羊毛小伙伴們! 剛剛在去哪兒大佬那兒發現了一個超級薅羊毛福利!我只花了短短兩分鐘,就搞到了一張5塊錢火車票代金券,簡直是天上掉餡餅的節奏啊! 話不多說,薅羊毛的姿勢給你們擺好…

代碼隨想錄算法訓練營第十六天(py)| 二叉樹 | 104.二叉樹的最大深度、111.二叉樹的最小深度、222.完全二叉樹的節點個數

104.二叉樹的最大深度 給定一個二叉樹 root ,返回其最大深度。 二叉樹的 最大深度 是指從根節點到最遠葉子節點的最長路徑上的節點數。 思路1 迭代法 層序遍歷 層序遍歷的思路很簡單,其結果本來就是按層數記錄的,只需返回結果的長度皆可。…

【C語言回顧】聯合和枚舉

前言1. 聯合體1.1 聯合體的聲明1.2 聯合體的特點1.3 聯合體的使用 2. 枚舉2.1 枚舉的聲明2.2 枚舉的特點2.3 枚舉的使用 結語 #include<GUIQU.h> int main { 上期回顧: 【C語言回顧】結構體 個人主頁&#xff1a;C_GUIQU 專欄&#xff1a;【C語言學習】 return 一鍵三連;…

解決法律條文的錄入前判斷發條沖突的需求;怎么選擇NLPModel?怎么使用模型?

要在NLPModel類中實現法律條文的沖突檢測功能&#xff0c;可以使用BERT模型來計算句子相似度。以下是詳細的步驟&#xff0c;包括如何選擇模型、訓練模型以及使用模型。 選擇NLP模型 根據你的需求&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Tra…

Linux多線程系列三: 生產者消費者模型,信號量使用,基于阻塞隊列和環形隊列的這兩種生產者消費者代碼的實現

Linux多線程系列三: 生產者消費者模型,信號量,基于阻塞隊列和環形隊列的這兩種生產者消費者代碼的實現 一.生產者消費者模型的理論1.現實生活中的生產者消費者模型2.多線程當中的生產者消費者模型3.理論 二.基于阻塞隊列的生產者消費者模型的基礎代碼1.阻塞隊列的介紹2.大致框架…

別說廢話!說話說到點上,項目高效溝通的底層邏輯揭秘

假設你下周要在領導和同事面前匯報項目進度&#xff0c;你會怎么做&#xff1f;很多人可能會去網上搜一個項目介紹模板&#xff0c;然后按照模板來填充內容。最后&#xff0c;匯報幻燈片做了 80 頁&#xff0c;自己覺得非常充實&#xff0c;但是卻被領導痛批了一頓。 這樣的境…

樹的非遞歸遍歷(層序)

層序是采用隊列的方式來遍歷的 就比如說上面這顆樹 他層序的就是&#xff1a;1 24 356 void LevelOrder(BTNode* root) {Que q;QueueInit(&q);if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){BTNode* front QueueFront(&q);QueuePop(&q);print…

簡析網絡風險量化的價值與應用實踐,如何構建網絡風險預防架構

網絡風險量化能夠讓公司董事會和高管層看清當前的網絡安全風險格局&#xff1b;它還將使安全團隊能夠在業務需求的背景下做出網絡安全決策&#xff0c;幫助組織確定哪些風險對業務構成最大的威脅&#xff0c;以及預期的經濟損失將是什么。 隨著網絡攻擊手段的日益多樣化和復雜…

多模態大模型新進展——GPT-4o、Project Astra關鍵技術丨青源Workshop第27期

青源Workshop丨No.27 多模態大模型新進展—GPT-4o、Project Astra關鍵技術主題閉門研討會 剛剛過去的兩天&#xff0c;OpenAI、Google紛紛發布了多模態大模型的最新成果&#xff0c;GPT-4o、Project Astra先后亮相。 本周五&#xff08;北京時間5月17日&#xff09;18點&#x…

O2OA(翱途)開發平臺數據統計如何配置?

O2OA提供的數據管理中心&#xff0c;可以讓用戶通過配置的形式完成對數據的匯總&#xff0c;統計和數據分組展現&#xff0c;查詢和搜索數據形成列表數據展現。也支持用戶配置獨立的數據表來適應特殊的業務的數據存儲需求。本文主要介紹如何在O2OA中開發和配置統計。 一、先決…