日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常考数据结构和算法:链表中环的入口节点

發布時間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常考数据结构和算法:链表中环的入口节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

對于一個給定的鏈表,返回環的入口節點,如果沒有環,返回null。

?

步驟:?
<1> 定義兩個指針p1和p2,在初始化時都指向鏈表的頭節點。?
<2> 如果鏈表中的環有n個節點,指針p1先在鏈表上向前移動n步。?
<3> 然后指針p1和p2以相同的速度在鏈表上向前移動直到它們相遇。?
<4> 它們相遇的節點就是環的入口節點。?
? ? 那么如何得到環中的節點數目?即通過一快一慢兩個指針來解決這個問題。當兩個指針相遇時,表明鏈表中存在環。兩個指針相遇的節點一定是在環中。可以從這個節點出發,一邊繼續向前移動一邊計數,當再次回到這個節點時,即可得到環中的節點數了。

public class TestIsCircleList {public static void main(String[] args) {TestIsCircleList t = new TestIsCircleList();ListNode a = new ListNode(1);ListNode b = new ListNode(2);ListNode c = new ListNode(3);ListNode d = new ListNode(4);ListNode e = new ListNode(5);ListNode f = new ListNode(6);ListNode g = new ListNode(7);a.next = b;b.next = c;c.next = d;d.next = e;e.next = f;f.next = g;g.next = d; // 形成環狀//boolean isHave = t.hasCycle(a);//System.out.println(isHave);detectCycle(a);}public static ListNode detectCycle(ListNode head) {ListNode slow = head; // 慢指針ListNode fast = head; // 快指針boolean isHaveCirle = false;while(null != fast && null != fast.next){slow = slow.next;fast = fast.next.next;if(slow == fast){// 通過一快一慢兩個指針來解決這個問題。當兩個指針相遇時,表明鏈表中存在環System.out.println("鏈表有環");isHaveCirle = true;break;}}if(!isHaveCirle){return null;}int circleCount = 1;slow = slow.next;// 求環的節點數while(fast != slow){circleCount++;// 一繼續向前移動一邊計數,當再次回到這個節點時,即可得到環中的節點數了slow = slow.next;}ListNode pre = head;ListNode post = head;for(int i=0;i<circleCount;i++){post = post.next;}while(pre != post){pre = pre.next;post = post.next;}return pre;} }

?

?

?

?

?

總結

以上是生活随笔為你收集整理的常考数据结构和算法:链表中环的入口节点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。