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 a31b3c4..e9d802a 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 @@ -81,4 +81,24 @@ public static ListNode middleNode(ListNode head) { return slow; } + + /** + * Deletes all duplicates such that each element appears only once + * + * @param head head of linked list + * @return linked list with unique elements + * @implNote This method runs in {@code O(n)} time complexity and {@code O(1)} space complexity + * @see 83. Remove Duplicates from Sorted List + */ + public static ListNode deleteDuplicates(ListNode head) { + ListNode pointer = head; + while (pointer != null && pointer.next != null) { + if (pointer.val == pointer.next.val) { + pointer.next = pointer.next.next; + } else { + pointer = pointer.next; + } + } + return head; + } } 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 812f028..dc9b896 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 @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Test; +import static com.xtenzq.linkedlist.FastPointers.deleteDuplicates; import static com.xtenzq.linkedlist.FastPointers.getMiddle; import static com.xtenzq.linkedlist.FastPointers.hasCycle; import static com.xtenzq.linkedlist.FastPointers.middleNode; @@ -60,4 +61,19 @@ void middleNode_case1() { void middleNode_case2() { assertEquals(buildLinkedList(4, 5, 6), middleNode(buildLinkedList(1,2,3,4,5,6))); } + + @Test + void deleteDuplicates_case1() { + assertEquals(buildLinkedList(1, 2, 3, 4, 5), deleteDuplicates(buildLinkedList(1, 2, 3, 3, 4, 4, 5))); + } + + @Test + void deleteDuplicates_case2() { + assertEquals(buildLinkedList(1), deleteDuplicates(buildLinkedList(1))); + } + + @Test + void deleteDuplicates_case3() { + assertEquals(buildLinkedList(1), deleteDuplicates(buildLinkedList(1, 1, 1))); + } } \ No newline at end of file