Good morning! Here's our prompt for today.
What is the best way to find out if a linked list
contains a loop? You're given the following data structure
as the definition of a linked list
node:
1class LinkedListNode {
2 constructor(val) {
3 this.val = val;
4 this.next = null;
5 }
6}
A loop or a cycle in graph
theory is a path of nodes and edges where a node is reachable from itself.

Implement a detectLoop
method that takes a linked list
head node as the parameter and returns true
or false
depending on whether there's a cycle.
Constraints
- Length of the linked list <=
10000
- Value stored in each node will be between
-1000000000
and1000000000
- Expected time complexity :
O(n)
- Expected space complexity :
O(1)
Try to solve this here or in Interactive Mode.
How do I practice this challenge?
xxxxxxxxxx
'PASSED: Assuming list1.head.next.next.next.next = list1.head, we can detect an artificial loop in the linked list'
var assert = require('assert');
β
function detectLoop(head) {
// Fill in this method
return head;
}
β
class LinkedListNode {
constructor(val) {
this.val = val;
this.next = null;
}
}
β
const list1 = new LinkedListNode(3);
const nodes = [4, 5, 6, 7, 8, 9, 10];
let head = list1;
for (let i = 0; i < nodes.length; i++) {
const newNode = new LinkedListNode(nodes[i]);
head.next = newNode;
head = newNode;
}
list1.next.next.next.next.next.next = list1.next.next;
console.log(detectLoop(list1));
β
function Node(val) {
this.val = val;
this.next = null;
}
We'll now take you through what you need to know.
How do I use this guide?
Build your intuition. Is this statement true or false?
A walk is a sequence of at least two vertices where nodes and edges may repeat. A cycle is a sequence of at least two vertices where nodes and edges cannot repeat.
Press true if you believe the statement is correct, or false otherwise.

Image credit to https://www.includehelp.com
Usually linked lists end with a node with no next
reference, but we're looking for a sequence with a next
pointer to a previous node. What might be the brute force solution here?
xxxxxxxxxx
// 1 -> 3 <-> 5
// |
// 7
In the above example, once we get to the second 3
node, how do we know we've got a cycle? We need some reference that we've previously encountered this vertex before.
What if we used a nested loop for tracking purposes? Let's take a look at what would happen in pseudocode:
xxxxxxxxxx
iterate through 1 -> 3 -> 5 -> 3 -> 7
iterate through what we've seen so far
At outer loop node 1
, we'd inner loop through 1
.
At outer loop node 3
, we'd inner loop through 1 -> 3
.
At outer loop node 5
, we'd inner loop through 1 -> 3 -> 5
.
At outer loop node 3
again, we'd inner loop through 1 -> 3 -> 5 -> 3
.
So the brute force way to do it is to conduct a nested traversal-- we can traverse all the nodes, and then at each iteration, traverse through the nodes already visited by the outer loop. In the inner loop, if we encounter a node twice, we know it's been repeated.
Build your intuition. Click the correct answer from the options.
The minimum number of pointers needed in the optimized algorithm is:
Click the option that best answers the question.
- 1
- 2
- 3
- 4
Try this exercise. Is this statement true or false?
A linked list
is a linear data structure.
Press true if you believe the statement is correct, or false otherwise.
Build your intuition. Click the correct answer from the options.
Which of the following is an advantage of Arrays over Linked Lists?
Click the option that best answers the question.
- Arrays can contain different types of data elements
- Accessing an element in an array is faster
- Insertions in Arrays is faster
- Deletions in an Array is faster
Try this exercise. Fill in the missing part by typing it in.
In a doubly linked list, traversal can be preformed in ___ directions.
Write the missing line below.
The fastest method is to traverse the linked list
using two pointers. This is a well known Computer Science technique: move one pointer by one node at a time, and the other pointer by two at a time.
If these pointers meet at the same node, then there's a loop. If the pointers don't meet, then the linked list
doesnβt have a loop.
The intuition here is that the faster pointer will go through the entire list at least once, and will inevitably meet the slower node at the beginning again. If there is a loop, they'll eventually converge.
Let's test your knowledge. Fill in the missing part by typing it in.
The pointer algorithm that moves through a sequence at two different speeds is called ___.
Write the missing line below.
Another way to think about it, notice that the distance between the two pointers increase by 1
after every iteration (one travels by 2
, one travels by 1
, so the distance increases). The distance is always going to be original distance
+ distance increase each iteration
(which is 1, 2, 3, ..). Because they are moving in a fixed-length cycle, they'll eventually meet.
The space complexity of the algorithm is O(1)
.
Are you sure you're getting this? Fill in the missing part by typing it in.
The time complexity of the above algorithm is __.
Write the missing line below.
Try this exercise. Click the correct answer from the options.
Which of the following is not a type of linked list?
Click the option that best answers the question.
- doubly linked list
- singly linked list
- circular linked list
- hybrid linked list
Are you sure you're getting this? Is this statement true or false?
In circular linked list, last node of the list points to the first node of the list.
Press true if you believe the statement is correct, or false otherwise.
Try this exercise. Fill in the missing part by typing it in.
A __ does not contain null
pointer in any of its nodes
Write the missing line below.
Try this exercise. Fill in the missing part by typing it in.
Asymptotic time complexity to add an element in a linked list
is ___.
Write the missing line below.
One Pager Cheat Sheet
- To detect a loop in a
linked list
, implement adetectLoop
method to take thelinked list
head node as the parameter and returntrue
orfalse
accordingly with the constraints oftime
andspace
complexities ofO(n)
andO(1)
, respectively. - A
walk
is a path through a graph that can either besimple
ormultiple
, and acycle
is a closed walk with no vertex/edge repetitions, starting and ending at the same vertex. - A
brute force
solution to detect aloop
in a linked list might be to manually traverse each node and check if there is any node that has anext
pointer to a previous node. - We can use a
nested loop
to check for cycles in a graph by keeping track of the previously-encountered vertices. - We can solve this problem by
nested traversal
, which requires us to traverse each node and then re-traverse the nodes already visited in the outer loop to identify any nodes that have been repeated. - The optimized algorithm only needs two
pointers
to traverse the graph, withconstant space complexity
, to detect any duplicate nodes. - A
Linked List
is a linear data structure composed of multiple nodes, each containing data and a pointer to the next node, allowing for efficient insertion, deletion, and navigation. - The key advantage of an array over a linked list is that it is much faster to access an element due to its contiguous block of memory, allowing random access with a calculatable memory address, contrasted with the nodes and pointers of linked lists, which requires node traversal.
- A
doubly linked list
provides efficient traversal bothforward
andbackward
compared to asingly linked list
, which only offersforward
traversal. - By using two pointers to traverse the linked list - one slow and one fast - we can detect whether there is a loop present.
- Floyd's Cycle-Finding Algorithm is a well-known Computer Science technique used to detect if there is a loop in a
linked list
by moving two pointers at different speeds through the list. - Two pointers will
meet
in afixed-length cycle
due to theirdistance increase of 1 per iteration
, resulting in anO(1)
space complexity. - The algorithm has a time complexity of O(n), as it
traverses
the arrayn
times to reach its end. - Hybrid linked list is a combination of different types of linked lists to create a unique list, rather than an existing type of linked list.
- A
circular linked list
has a pointer from the last node to the first node, forming a loop rather than a NULL pointer. - A
circular linked list
provides an infinite loop-like structure in which each node contains the address of the next node, eliminating the need for anull
pointer. - The time complexity to add an element to a
linked list
isO(n)
due to the need to traverse the entire list to find thenull pointer
.
This is our final solution.
To visualize the solution and step through the below code, click Visualize the Solution on the right-side menu or the VISUALIZE button in Interactive Mode.
xxxxxxxxxx
}
var assert = require('assert');
β
function detectLoop(head) {
let pointer1, pointer2;
pointer1 = head;
pointer2 = head;
β
while (pointer2.next.next) {
pointer1 = pointer1.next;
pointer2 = pointer2.next.next;
β
if (pointer1 == pointer2) {
return true;
}
}
return false;
}
β
function Node(val) {
this.val = val;
this.next = null;
}
β
function LinkedListNode(val) {
this.val = val;
this.next = null;
}
β
var list1 = new LinkedListNode(3);
var nodes1 = [4, 5, 6, 7, 8, 9, 10];
createNodes(list1, nodes1);
β
Alright, well done! Try another walk-through.
If you had any problems with this tutorial, check out the main forum thread here.