」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Floyd 演算法如何偵測鍊錶中的迴圈?

Floyd 演算法如何偵測鍊錶中的迴圈?

發佈於2024-11-07
瀏覽:202

How Does Floyd\'s Algorithm Detect Loops in Linked Lists?

使用 Floyd 演算法檢測鍊錶中的循環

確定給定鍊錶是否包含循環在 Java 程式設計中是一項具有挑戰性的任務。當清單中的最後一個節點引用前一個節點而不是空引用時,就會發生循環。

為了有效地偵測循環,開發人員通常採用 Floyd 的循環查找演算法,也稱為龜兔賽跑演算法。該演算法使用兩個引用,一個慢速引用和一個快速引用,它們以不同的速度遍歷列表。

例如,慢速引用前進一個節點,而快速引用前進兩個節點。如果鍊錶包含循環,這些引用最終會相遇。另一方面,如果沒有循環,則慢引用或快速引用(或它們的後續引用)將在另一個到達列表末尾之前變為 null。

這裡是 Floyd 演算法的 Java 實作:

boolean hasLoop(Node first) {
    if (first == null) {
        return false; // List does not exist, so no loop
    }

    Node slow, fast; // Create two references.
    slow = fast = first; // Make both refer to the start of the list.

    while (true) {
        slow = slow.next; // One hop.

        if (fast.next != null) {
            fast = fast.next.next; // Two hops.
        } else {
            return false; // No loop.
        }

        if (slow == null || fast == null) {
            return false; // No loop.
        }

        if (slow == fast) {
            return true; // Loop detected.
        }
    }
}

此演算法的空間複雜度為 O(1),運行時間為 O(n),因此既節省記憶體又相當耗時。

最新教學 更多>
  • 理解 Shadow DOM:封裝 Web 元件的關鍵
    理解 Shadow DOM:封裝 Web 元件的關鍵
    在現代 Web 開發中,創建可重複使用和可維護的元件至關重要。 Shadow DOM 是 Web 元件標準的一部分,在實現這一目標方面發揮著至關重要的作用。本文深入探討了 Shadow DOM 的概念、它的優點以及如何在您的專案中有效地使用它。 什麼是 Shadow DOM? Sh...
    程式設計 發佈於2024-11-07
  • 如何使用 Java 運行時解決輸出重定向問題?
    如何使用 Java 運行時解決輸出重定向問題?
    使用Runtime 的exec() 方法解決輸出重定向問題在Java 中,利用Runtime.getRuntime().exec() 運行指令可以擷取進程的輸出和錯誤流。但是,在需要輸出重定向的情況下,單獨使用此方法可能會無效。 問題:輸出未重定向當使用Runtime.getRuntime().ex...
    程式設計 發佈於2024-11-07
  • 如何使用 CSS 懸停效果從左到右填滿背景顏色?
    如何使用 CSS 懸停效果從左到右填滿背景顏色?
    使用CSS 從左到右填充背景顏色在CSS 中,您可以透過利用線性漸層和動畫背景定位來創造迷人的懸停效果。這種方法使您能夠在懸停時從左到右用新顏色填充元素的背景。 線性漸變和背景大小關鍵是使用由兩種顏色組成的線性漸變背景,並將背景大小設定為元素寬度的兩倍。這允許您在兩種顏色之間創建無縫過渡。 背景定位...
    程式設計 發佈於2024-11-07
  • GraalVM 本機映像中的記憶體管理
    GraalVM 本機映像中的記憶體管理
    内存管理是计算机软件开发的重要组成部分,负责应用程序中内存的有效分配、利用和释放。其重要性在于增强软件性能,保证系统稳定性。 垃圾收集 垃圾收集 (GC) 在 Java 和 Go 等当代编程语言中至关重要。它自动检测并回收未使用的内存,从而减轻开发人员手动管理内存的需要。 GC 的概...
    程式設計 發佈於2024-11-07
  • ## 在 C++ 中什麼時候應該使用參考作為函數參數?
    ## 在 C++ 中什麼時候應該使用參考作為函數參數?
    在 C 中傳遞參數:瞭解引用在 C 中,函數參數的行為由其型別決定。一個重要的區別是「按值傳遞」和「按引用傳遞」。 為什麼在函數參數中使用引用? 引用在函數參數中用於兩種情況主要原因:修改參數:引用允許函數修改值論證通過了。這意味著該函數可以進行呼叫者可見的更改。 避免物件複製: 透過引用傳遞大物件...
    程式設計 發佈於2024-11-07
  • 為什麼會出現“getaddrinfo 失敗”以及如何修復?
    為什麼會出現“getaddrinfo 失敗”以及如何修復?
    探索“getaddrinfo failed”錯誤名稱解析過程中發生錯誤“getaddrinfo failed”,其中主機名稱被翻譯轉換為IP 位址。它顯示所提供的主機名的解析有問題。 深入研究錯誤情境從提供的錯誤追蹤中,我們可以將原因追溯到套接字。 getaddrinfo(主機,連接埠)方法。當無法...
    程式設計 發佈於2024-11-07
  • 如何在單一命令列中運行多行命令?
    如何在單一命令列中運行多行命令?
    如何在一行命令列中執行多行語句使用Python的-c選項執行單行循環時,在循環之前導入模組會導致語法錯誤。這是因為Python解釋器將程式碼區塊視為單一語句。 要解決此問題,可以採用以下幾種方法:使用管道要克服語法錯誤,請使用echo 命令將程式碼區塊作為一系列輸入行重定向到Python:echo ...
    程式設計 發佈於2024-11-07
  • 如何在 PHP 中從 MySQL 遷移到 MySQLi?
    如何在 PHP 中從 MySQL 遷移到 MySQLi?
    從 MySQL 遷移到 MySQLi將網站從 MySQL 遷移到 MySQLi 需要修改 PHP 程式碼,但資料庫本身基本上不受影響。 MySQLi 是 MySQL 擴充功能的改進版本,提供增強的功能和安全性。 PHP 程式碼變更是的,您可以簡單地將 MySQLi 函數替換為 MySQL 函數。這裡...
    程式設計 發佈於2024-11-07
  • 如何在CSS中實現背景和子元素的不同透明度?
    如何在CSS中實現背景和子元素的不同透明度?
    理解 CSS 背景不透明度在 CSS 中,不透明度控制元素的透明度。當應用於容器時,它自然會影響背景及其子元素。 繼承問題要實現背景和子元素不同的不透明度, CSS 繼承帶來了挑戰。子元素從其父容器繼承不透明度,從而導致所提供範例中的背景和文字具有相同的不透明度。 實現所需不透明度的解決方案實現要達...
    程式設計 發佈於2024-11-07
  • 【個人網站】Next如何整合Notion資料庫
    【個人網站】Next如何整合Notion資料庫
    To integrate a Notion database into a Next.js project, you can use Notion as a content management system (CMS) and display its content on your website...
    程式設計 發佈於2024-11-07
  • 為什麼 PhpMyAdmin 在 Ubuntu 12.04 上給出「MySQLi 擴充缺失」錯誤?
    為什麼 PhpMyAdmin 在 Ubuntu 12.04 上給出「MySQLi 擴充缺失」錯誤?
    PhpMyAdmin 錯誤:MySQLi 擴充缺失在 Ubuntu 12.04 遇到 PhpMyAdmin 問題?儘管安裝了 Apache2、PHP5、MySQL 和 PhpMyAdmin,您還是遇到了「mysqli 擴充遺失」錯誤。 儘管您已取消註解 php.ini 中的「extension=my...
    程式設計 發佈於2024-11-07
  • 如何使用 java.net.URLConnection 將檔案和附加參數上傳到 HTTP 伺服器?
    如何使用 java.net.URLConnection 將檔案和附加參數上傳到 HTTP 伺服器?
    在 Java 中使用附加參數將檔案上傳到 HTTP 伺服器將檔案上傳到 HTTP 伺服器是許多應用程式的常見需求。但是,有時也需要隨文件一起傳遞附加參數。這是一個允許您在不使用外部庫的情況下發送文件和參數的解決方案:java.net.URLConnection 和Multipart/Form-Dat...
    程式設計 發佈於2024-11-07
  • 如何在 PHP 中逐行讀取和處理文字檔?
    如何在 PHP 中逐行讀取和處理文字檔?
    在 PHP 中讀取文字檔案:逐步指南許多 Web 開發場景都涉及從文字檔案讀取資料。在 PHP 中,檔案處理函數提供了逐行讀取純文字檔案的便捷方法。讓我們分解一下使用 PHP 讀取文字檔案的過程。 讀取文字檔案的程式碼:以下PHP 程式碼片段示範如何讀取文字檔案並逐行處理其內容:<?php /...
    程式設計 發佈於2024-11-07
  • 我離不開的生產力工具(獎勵)
    我離不開的生產力工具(獎勵)
    大家好,你們的孩子 Nomadev 帶著另一篇貼文回來了!今天,我很高興與大家分享一些我每天使用的超酷的人工智慧工具。這些工具已成為我日常工作的重要部分,幫助我保持井井有條、有效率並完成更多工作。 在當今快節奏的世界中,我們都希望提高生產力和效率。借助人工智慧,有大量工具可以幫助我們管理任務、簡化...
    程式設計 發佈於2024-11-07
  • 在 Go/Templ 中製作一個乾淨、友好的 Spinner
    在 Go/Templ 中製作一個乾淨、友好的 Spinner
    无用的 HTML 你们可能认为在 HTML 中制作一个一致、干净且专业的旋转框是一项简单的任务...但是,令我们失望的是,没有标准的属性来告诉输入它应该只接受整数或小数值,所有的输入过滤都必须是JS。哎呀! 我将使用 Go、a-h/Templ、Tailwind 和我心爱的 Alpi...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3