From 120b28cfd0e8efb966a89a30d16d99dda0e19a9f Mon Sep 17 00:00:00 2001 From: Nikita Rusetskii Date: Sun, 21 Jul 2024 20:00:32 +0200 Subject: [PATCH] Add Return the k-th Node from the End Problem (#32) --- .../com/xtenzq/linkedlist/FastPointers.java | 22 +++++++++++++++++++ .../xtenzq/linkedlist/FastPointersTest.java | 11 ++++++++++ 2 files changed, 33 insertions(+) diff --git a/algorithms-and-data-structures/src/main/java/com/xtenzq/linkedlist/FastPointers.java b/algorithms-and-data-structures/src/main/java/com/xtenzq/linkedlist/FastPointers.java index 0b42a4d..a66d00d 100644 --- a/algorithms-and-data-structures/src/main/java/com/xtenzq/linkedlist/FastPointers.java +++ b/algorithms-and-data-structures/src/main/java/com/xtenzq/linkedlist/FastPointers.java @@ -40,4 +40,26 @@ public static boolean hasCycle(ListNode head) { } return false; } + + /** + * Return the {@code k}-th node from the end of the linked list + * + * @param head of linked list + * @param k element position from the end + * @return node value of {@code k}-th node from the end + * @implNote This method runs in {@code O(n)} time complexity and {@code O(1)} space complexity + */ + public static int nodeFromEnd(ListNode head, int k) { + ListNode slow = head; + ListNode fast = head; + for (int i = 0; i < k; i++) { + fast = fast.next; + } + + while (fast != null) { + slow = slow.next; + fast = fast.next; + } + return slow.val; + } } diff --git a/algorithms-and-data-structures/src/test/java/com/xtenzq/linkedlist/FastPointersTest.java b/algorithms-and-data-structures/src/test/java/com/xtenzq/linkedlist/FastPointersTest.java index 2769067..f36c924 100644 --- a/algorithms-and-data-structures/src/test/java/com/xtenzq/linkedlist/FastPointersTest.java +++ b/algorithms-and-data-structures/src/test/java/com/xtenzq/linkedlist/FastPointersTest.java @@ -4,6 +4,7 @@ import static com.xtenzq.linkedlist.FastPointers.getMiddle; import static com.xtenzq.linkedlist.FastPointers.hasCycle; +import static com.xtenzq.linkedlist.FastPointers.nodeFromEnd; import static com.xtenzq.linkedlist.utils.ListNode.buildLinkedList; import static com.xtenzq.linkedlist.utils.ListNode.buildLinkedListWithCycle; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -38,4 +39,14 @@ void hasCycle_case2() { void hasCycle_case3() { assertFalse(hasCycle(buildLinkedListWithCycle(new int[]{1}, -1))); } + + @Test + void nodeFromEnd_case1() { + assertEquals(4, nodeFromEnd(buildLinkedList(1, 2, 3, 4, 5), 2)); + } + + @Test + void nodeFromEnd_case2() { + assertEquals(1, nodeFromEnd(buildLinkedList(1), 1)); + } } \ No newline at end of file