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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

判断一个单链表中是否有环

發(fā)布時間:2024/8/26 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断一个单链表中是否有环 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路:快慢指針實現

用兩個指針,一個指針一次走一步,另一個指針一次走兩步,如果存在環(huán),則這兩個指針會在環(huán)內相遇,時間復雜度為O(n)

  /*** 檢測單鏈表中是否有環(huán)*/public static boolean hasCircle(ListNode head) {if(null == head) {return false;}ListNode slow = head;ListNode fast = head;while(fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;if(fast == slow){return true;//兩個指針相遇 }}return false;}

拓展1:如果單鏈表有環(huán),找出環(huán)的入口節(jié)點(環(huán)的連接點)

  /***如果單鏈表有環(huán),找出環(huán)的入口節(jié)點(環(huán)的連接點)。*這里先證明一個定理:碰撞點到連接點的距離=頭指針到連接點的距離*假設單鏈表的總長度為L,頭結點到環(huán)入口的距離為a,環(huán)入口到快慢指針相遇的結點距離為x,環(huán)的長度為r,*慢指針總共走了s步,則快指針走了2s步。另外,快指針要追上慢指針的話快指針至少要在環(huán)里面轉了一圈多(假設轉了n圈加x的距離)*得到以下關系:*s = a + x*2s = a + nr + x*=>a + x = nr*=>a = nr - x //入口點*/public static ListNode searchEntranceNode(ListNode head) {ListNode slow=head;//p表示從頭結點開始每次往后走一步的指針ListNode fast=head;//q表示從頭結點開始每次往后走兩步的指針while(fast !=null && fast.next !=null) {slow=slow.next;fast=fast.next.next;if(slow==fast) {break;//p與q相等,單鏈表有環(huán) }}if(fast == null || fast.next == null){return null;}slow=head;while(slow != fast){slow=slow.next;fast=fast.next;}return slow;}   public static ListNode searchEntranceNode1(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){fast=slow;//相遇點slow=head;while(slow != fast){slow = slow.next;fast = fast.next;}if(slow == fast)return fast;}}return null;}

拓展二:求鏈表中環(huán)的長度

/*** 求環(huán)的長度*/public static int countCircleSize(ListNode head) {ListNode entranceNode = searchEntranceNode1(head);//環(huán)的入口點if(entranceNode == null) {return 0;}ListNode slow = entranceNode.next;int size = 1;while(slow != entranceNode) {slow = slow.next;size++;}return size;}

?

轉載于:https://www.cnblogs.com/cherish010/p/10572378.html

總結

以上是生活随笔為你收集整理的判断一个单链表中是否有环的全部內容,希望文章能夠幫你解決所遇到的問題。

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