摘要:單鏈表的反轉(zhuǎn)頭插法兩個(gè)指針,表示的后一個(gè)節(jié)點(diǎn),表示的前一個(gè)節(jié)點(diǎn),都作為臨時(shí)節(jié)點(diǎn)先把節(jié)點(diǎn)指向后面節(jié)點(diǎn)的指針保存起來,則此時(shí)節(jié)點(diǎn)和節(jié)點(diǎn)值和指針是相同的指向前一個(gè)節(jié)點(diǎn)與進(jìn)行右移,遞歸斜體文字鏈表的倒數(shù)第個(gè)節(jié)點(diǎn)雙指針解決先走步,然后開始走,走到結(jié)尾
單鏈表的反轉(zhuǎn)
頭插法
兩個(gè)指針,next 表示 head 的后一個(gè)節(jié)點(diǎn),pre 表示 head 的前一個(gè)節(jié)點(diǎn),都作為臨時(shí)節(jié)點(diǎn)
先把 head 節(jié)點(diǎn)指向后面節(jié)點(diǎn)的指針保存起來 next = head.next ,則此時(shí) next 節(jié)點(diǎn)和 2 節(jié)點(diǎn)值和指針是相同的
head 指向前一個(gè)節(jié)點(diǎn) head.next = pre
pre 與 head 進(jìn)行右移 pre = head,head = next
public static ListNode ReverseList(ListNode head) { ListNode pre = null; ListNode next = null; if (head == null || head.next == null){ return head; } while (head != null){ next = head.next; head.next = pre; pre = head; head = next; } return pre; } 遞歸 *斜體文字*public static ListNode ReverseListStack(ListNode head){ if (head == null || head.next == null){ return head; } ListNode node = ReverseListStack(head.next); head.next.next = head; head.next = null; return node; }
鏈表的倒數(shù)第 K 個(gè)節(jié)點(diǎn)
1.雙指針解決
2.fast 先走K步,然后 low 開始走,fast 走到結(jié)尾的時(shí)候 low 則指向倒數(shù)第 K 個(gè)節(jié)點(diǎn)
3.主要 異常情況,K < 0 ,K > len(List)
public static ListNode getKNode(ListNode head,int k){ if (head == null || k < 0){ return null; } ListNode pre = head; ListNode next = head; for (int l = 0; l < k; l++) { if (next != null) { next = next.next; }else { return null; } } while (next != null){ pre = pre.next; next = next.next; } return pre; }
鏈表是否有環(huán)、環(huán)的入口
1.快慢指針,快指針每次走兩步,慢指針每次走一步
2.若在遍歷鏈表的過程中,出現(xiàn) 快指針指向的節(jié)點(diǎn)等于慢指針指向的節(jié)點(diǎn),說明鏈表有環(huán),并且相遇的點(diǎn)一定在環(huán)中(不然不可能相遇)
3.設(shè)定 鏈表頭到環(huán)入口的距離為 x ,環(huán)入口到相遇點(diǎn)的距離為 a,環(huán)的總長度為 c,環(huán)相遇點(diǎn)到入口的距離為 b,則 a+b = c
4.假設(shè)此時(shí)快慢指針在環(huán)內(nèi)相遇,那么
慢指針走過的距離 Step(low) = x + m * c + a (m為慢指針走過的圈數(shù)) ①
快指針走過的距離 Step(fast) = x + n * c + a (n為快指針走過的圈數(shù)) ②
Step(fast) = 2 * Step(low)③
5.根據(jù)①②③,得到 x = c (n - 2 m - 1)+ b ,也就是說鏈表頭到環(huán)入口的距離 x 等于 環(huán)的長度 c 的倍數(shù) + b
6.相遇時(shí),此時(shí)若將慢(快)其中一個(gè)放到鏈表開頭,然后開頭的指針和環(huán)中的指針一起一步步走,那么開頭的指針走 x 步時(shí),環(huán)中的指針將走 k 圈 + b 步,此時(shí) 兩指針再次相遇,并且相遇點(diǎn)位環(huán)入口點(diǎn),即為所求
public static ListNode getCircleroot(ListNode head){ if (head == null || head.next == null){ return null; } ListNode slow = head; ListNode fast = head; while (fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; if (slow == fast){ // 相遇時(shí) 終止循環(huán) break; } } if (fast != slow){ return null; } fast = head; // 將其中一個(gè)指針指向開頭 while (fast != slow){ fast = fast.next; slow = slow.next; } // 再次相遇時(shí)即為環(huán)入口點(diǎn) return fast; }
歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70521.html
摘要:單鏈表是數(shù)據(jù)結(jié)構(gòu)中以動(dòng)態(tài)結(jié)構(gòu)存儲(chǔ)的線性結(jié)構(gòu),在語言中,一般用本類對(duì)象引用的方式在內(nèi)存中將一組相同類型的對(duì)象存儲(chǔ),熟悉單鏈表的基本操作有助于靈活解決此類算法問題。 單鏈表是數(shù)據(jù)結(jié)構(gòu)中以動(dòng)態(tài)結(jié)構(gòu)存儲(chǔ)的線性結(jié)構(gòu),在Java語言中,一般用本類對(duì)象引用的方式在內(nèi)存中將一組相同類型的對(duì)象存儲(chǔ),熟悉單鏈表的基本操作有助于靈活解決此類算法問題。 1.單鏈表中的節(jié)點(diǎn)可以用節(jié)點(diǎn)類型描述如下: public...
摘要:鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的線性表將采用一組任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。三單向鏈表的實(shí)現(xiàn)下面的程序分別實(shí)現(xiàn)了線性表的初始化獲取線性表長度獲取指定索引處元素根據(jù)值查找插入刪除清空等操作。 文章有不當(dāng)之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號(hào):好好學(xué)java,獲取優(yōu)質(zhì)學(xué)習(xí)資源。 一、概述 單向鏈表(單鏈表)是鏈表的一種,其特點(diǎn)是鏈表的鏈接方向是單向的,對(duì)鏈表的訪問要通過順序讀...
閱讀 3581·2023-04-26 02:10
閱讀 1343·2021-11-22 15:25
閱讀 1684·2021-09-22 10:02
閱讀 920·2021-09-06 15:02
閱讀 3480·2019-08-30 15:55
閱讀 613·2019-08-30 13:58
閱讀 2789·2019-08-30 12:53
閱讀 3068·2019-08-29 12:38