Determine if a given singly linked list is circular, where a circular list's final node points back to some other node in the list.
To detect a cycle in a linked list, employ a 'slow' and a 'fast' pointer. If at any point during the traversal, the slow pointer encounters the fast pointer before the end of the loop, it confirms the presence of a cycle within the list. Initially, the slow pointer is assigned to the head of the list, and the fast pointer is assigned to the next node of the head
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LL:
def __init__(self, nodes):
self.head = nodes[0]
tail = self.head
for i in range(1, len(nodes)):
tail.next = nodes[i]
tail = nodes[i]
def isCircular(self):
if not self.head:
return False
slow = self.head
fast = self.head.next
while fast and fast.next:
if slow == fast:
return True
slow = slow.next
fast = fast.next.next
return False
'''
def print(self):
tail = self.head
while tail:
print(tail.data, end = " ")
tail = tail.next
print()
'''
n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
ll = LL([n1, n2, n3])
print(ll.isCircular())
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class LL {
constructor(nodes) {
this.head = nodes[0];
let tail = this.head;
for (let i = 1; i < nodes.length; i++) {
tail.next = nodes[i];
tail = nodes[i];
}
}
isCircular() {
if (!this.head) {
return false;
}
let slow = this.head;
let fast = this.head.next;
while (fast && fast.next) {
if (slow == fast) {
return true;
}
slow = slow.next;
fast = fast.next.next;
}
return false;
}
}
const n1 = new Node(1);
const n2 = new Node(2);
const n3 = new Node(3);
const ll = new LL([n1, n2, n3]);
console.log(ll.isCircular())