- Published on
Detecting Linked List Loops
444 words3 min read
- Authors
- Name
- Curtis Warcup
In a circular linked list, we do NOT have a tail node. The "last node" points to a node within the list.
The current methods for iterating over a linked list such as for...of or forEach will not work with a circular linked list because these use a node that points to null to complete the loop. In a circular linked list, no node points to null.
Examples:
const l = new List()
const a = new Node('a')
const b = new Node('b')
const c = new Node('c')
l.head = a
a.next = b
b.next = c
c.next = b
circular(l) // true
Strategy - Circular Linked List
- use two pointers,
slowandfastto iterate through the linked list. - initialize both points to the head of the linked list.
- if the next two nodes after
fastare defined, we will movefasttwo nodes ahead andslowone node ahead. - we then do a check to see if
fastis pointing to the same node asslow.- if it is, we know that the linked list is circular.
- If not, we continue to iterate through the linked list, moving
fastup two nodes andslowone node.
Circular Linked List Solution
function circular(list) {
let slow = list.head
let fast = list.head
// loop as long as fast has two nodes ahead of it.
while (fast.next && fast.next.next) {
slow = slow.next
fast = fast.next.next
// compare slow and fast nodes
// compare the nodes in memory, not the data
if (slow === fast) {
return true // circular
}
}
return false // not circular
}