From c25c3d65cbd7c7b8545baaf7c27bd42cab566a69 Mon Sep 17 00:00:00 2001 From: sumanas27 Date: Sun, 18 May 2025 23:53:31 +0200 Subject: [PATCH] LinkedList Cycle Detection --- src/main/kotlin/Main.kt | 16 ++++++- .../LinkedListCycleDetection.kt | 48 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/dsalgoleetcode/LinkedListCycleDetection.kt diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index af0944f..1e277c1 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,5 +1,7 @@ package main.kotlin +import main.kotlin.dsalgoleetcode.LinkedListCycleDetection +import main.kotlin.dsalgoleetcode.ListNode import main.kotlin.dsalgoleetcode.LongestSubstring import main.kotlin.dsalgoleetcode.TwoSum @@ -11,11 +13,21 @@ fun main() { // Calling Two Sum class val twoSum = TwoSum() val result = twoSum.twoSum(nums = intArrayOf(1, 2, 3, 4, 5), target = 9) + println("Indices: ${result.joinToString(",")}") // Calling Longest Substring val longestSubstring = LongestSubstring() val lsResult = longestSubstring.lengthOfLongestSubstring(s = "abcabcbbb") - - println("Indices: ${result.joinToString(",")}") println("Longest Substring : $lsResult") + + // Calling LinkedList Cycle Detection + val linkedListCycleDetection = LinkedListCycleDetection() + val node1 = ListNode(1) + val node2 = ListNode(2) + val node3 = ListNode(3) + node1.next = node2 + node2.next = node3 + node3.next = node1 // cycle back to x + val llcdResult = linkedListCycleDetection.hasCycle(node1) + println("Has cycle $llcdResult") } \ No newline at end of file diff --git a/src/main/kotlin/dsalgoleetcode/LinkedListCycleDetection.kt b/src/main/kotlin/dsalgoleetcode/LinkedListCycleDetection.kt new file mode 100644 index 0000000..aa49aa6 --- /dev/null +++ b/src/main/kotlin/dsalgoleetcode/LinkedListCycleDetection.kt @@ -0,0 +1,48 @@ +package main.kotlin.dsalgoleetcode + +/** + * Linked List Cycle + * + * Given head, the head of a linked list, determine if the linked list has a cycle in it. + * There is a cycle in a linked list if there is some node in the list that can be reached + * again by continuously following the next pointer. Internally, pos is used to denote the + * index of the node that tail's next pointer is connected to. Note that pos is not passed + * as a parameter. + * + * Return true if there is a cycle in the linked list. Otherwise, return false. + * + * Input: head = [3,2,0,-4], pos = 1 + * Output: true + * Explanation: There is a cycle in the linked list, where the tail connects to + * the 1st node (0-indexed). + * */ + +class LinkedListCycleDetection { + + /** + * Example: + * var li = ListNode(5) + * var v = li.`val` + * Definition for singly-linked list. + * class ListNode(var `val`: Int) { + * var next: ListNode? = null + * } + */ + + fun hasCycle(head: ListNode?): Boolean { + var slow = head + var fast = head + while (fast != null && fast.next != null) { + slow = slow?.next + fast = fast.next?.next + if (slow == fast) + return true + } + return false + } +} + + +class ListNode(var `val`: Int) { + var next: ListNode? = null +} \ No newline at end of file