判断一个单链表中是否有环
生活随笔
收集整理的這篇文章主要介紹了
判断一个单链表中是否有环
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路:快慢指針實現
用兩個指針,一個指針一次走一步,另一個指針一次走兩步,如果存在環,則這兩個指針會在環內相遇,時間復雜度為O(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:如果單鏈表有環,找出環的入口節點(環的連接點)
/***如果單鏈表有環,找出環的入口節點(環的連接點)。*這里先證明一個定理:碰撞點到連接點的距離=頭指針到連接點的距離*假設單鏈表的總長度為L,頭結點到環入口的距離為a,環入口到快慢指針相遇的結點距離為x,環的長度為r,*慢指針總共走了s步,則快指針走了2s步。另外,快指針要追上慢指針的話快指針至少要在環里面轉了一圈多(假設轉了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相等,單鏈表有環 }}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;}拓展二:求鏈表中環的長度
/*** 求環的長度*/public static int countCircleSize(ListNode head) {ListNode entranceNode = searchEntranceNode1(head);//環的入口點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
總結
以上是生活随笔為你收集整理的判断一个单链表中是否有环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat的日志文件权限与启动用户的权
- 下一篇: 【SpringBoot】服务器端主动推送