From 2096c22d436935fb843b102a9ed553951c5c62c1 Mon Sep 17 00:00:00 2001 From: Gang Wu Date: Sat, 12 Sep 2020 16:50:40 -0600 Subject: [PATCH] BAEL-4453 Reversing a Linked List in Java --- .../linkedlist/LinkedListReversal.java | 30 ++++++++++ .../algorithms/linkedlist/ListNode.java | 28 +++++++++ .../LinkedListReversalUnitTest.java | 59 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java create mode 100644 algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java create mode 100644 algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java new file mode 100644 index 0000000000..93402133ff --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/LinkedListReversal.java @@ -0,0 +1,30 @@ +package com.baeldung.algorithms.linkedlist; + +public class LinkedListReversal { + + ListNode reverseList(ListNode head) { + ListNode previous = null; + ListNode current = head; + while (current != null) { + ListNode nextElement = current.getNext(); + current.setNext(previous); + previous = current; + current = nextElement; + } + return previous; + } + + ListNode reverseListRecursive(ListNode head) { + if (head == null) { + return null; + } + if (head.getNext() == null) { + return head; + } + ListNode node = reverseListRecursive(head.getNext()); + head.getNext().setNext(head); + head.setNext(null); + return node; + } + +} diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java new file mode 100644 index 0000000000..de2e93a65c --- /dev/null +++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/linkedlist/ListNode.java @@ -0,0 +1,28 @@ +package com.baeldung.algorithms.linkedlist; + +public class ListNode { + + private int data; + private ListNode next; + + ListNode(int data) { + this.data = data; + this.next = null; + } + + public int getData() { + return data; + } + + public ListNode getNext() { + return next; + } + + public void setData(int data) { + this.data = data; + } + + public void setNext(ListNode next) { + this.next = next; + } +} diff --git a/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java new file mode 100644 index 0000000000..0940677959 --- /dev/null +++ b/algorithms-miscellaneous-6/src/test/java/com/baeldung/algorithms/linkedlist/LinkedListReversalUnitTest.java @@ -0,0 +1,59 @@ +package com.baeldung.algorithms.linkedlist; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class LinkedListReversalUnitTest { + @Test + public void givenLinkedList_whenIterativeReverse_thenOutputCorrectResult() { + ListNode head = constructLinkedList(); + ListNode node = head; + for (int i = 1; i <= 5; i++) { + assertNotNull(node); + assertEquals(i, node.getData()); + node = node.getNext(); + } + LinkedListReversal reversal = new LinkedListReversal(); + node = reversal.reverseList(head); + for (int i = 5; i >= 1; i--) { + assertNotNull(node); + assertEquals(i, node.getData()); + node = node.getNext(); + } + } + + @Test + public void givenLinkedList_whenRecursiveReverse_thenOutputCorrectResult() { + ListNode head = constructLinkedList(); + ListNode node = head; + for (int i = 1; i <= 5; i++) { + assertNotNull(node); + assertEquals(i, node.getData()); + node = node.getNext(); + } + LinkedListReversal reversal = new LinkedListReversal(); + node = reversal.reverseListRecursive(head); + for (int i = 5; i >= 1; i--) { + assertNotNull(node); + assertEquals(i, node.getData()); + node = node.getNext(); + } + } + + private ListNode constructLinkedList() { + ListNode head = null; + ListNode tail = null; + for (int i = 1; i <= 5; i++) { + ListNode node = new ListNode(i); + if (head == null) { + head = node; + } else { + tail.setNext(node); + } + tail = node; + } + return head; + } +}