Skip to content

Added Floyd's Tortoise and Hare algorithm #609

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -120,6 +120,7 @@ a set of rules that precisely define a sequence of operations.
* `B` [Counting Sort](src/algorithms/sorting/counting-sort)
* `B` [Radix Sort](src/algorithms/sorting/radix-sort)
* **Linked Lists**
* `B` [Floyd's Tortoise And Hare](src/algorithms/linked-list/tortoise-and-hare) - find a cycle in a linked list
* `B` [Straight Traversal](src/algorithms/linked-list/traversal)
* `B` [Reverse Traversal](src/algorithms/linked-list/reverse-traversal)
* **Trees**
13 changes: 13 additions & 0 deletions src/algorithms/linked-list/tortoise-and-hare/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Floyd's Tortoise and Hare
**Floyd's cycle-finding algorithm** is a pointer algorithm that is used for finding a cycle in a linked list. It uses only two pointers, each moving at different speeds. It is also called the "tortoise and the hare algorithm", alluding to Aseop's fable of [The Tortoise and the Hare](https://en.wikipedia.org/wiki/The_Tortoise_and_the_Hare).

## Main algorithm
1. Create two pointers, which are the tortoise and the hare. Tortoise begins at the head, while hare begins at `head.next`.
2. Since hare and `hare.next` are not null, enter the while loop. Tortoise and hare are not equal to each other, so we'll move both of them over. Tortoise gets moved one spot, while hare gets moved two spots.
3. Repeat step two until the while loop is still true and tortoise and hare are equal to each other.
* If tortoise and hare are equal to eachother, then return true because a cycle was found.
* Otherwise, if the while loop cannot continue because hare and/or `hare.next` is null, then return false because no cycle was found.

## References
* [Wikipedia](https://en.wikipedia.org/wiki/Cycle_detection#Floyd's_Tortoise_and_Hare)
* [Floyd's Tortoise and Hare Algorithm: Finding a Cycle in a Linked List](https://dev.to/alisabaj/floyd-s-tortoise-and-hare-algorithm-finding-a-cycle-in-a-linked-list-39af)
27 changes: 27 additions & 0 deletions src/algorithms/linked-list/tortoise-and-hare/hasCycle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* @param {object} linkedList - The linked list to check
* @returns {boolean}
*/
export default function hasCycle(linkedList) {
const head = linkedList.head;

// Check if head and head.next exist
if (!head || !head.next) {
return false; // No cycle was found
}

let tortoise = head;
let hare = head.next;

while (hare && hare.next) {
// Check if tortoise and hare are equal to each other
if (tortoise === hare) {
return true; // A cycle was found
}

tortoise = tortoise.next;
hare = hare.next.next;
}

return false; // No cycle was found
}