Skip to content

Commit 9be81a6

Browse files
author
Gang Wu
committed
BAEL-4453 Reversing a Linked List in Java
1 parent 22fba25 commit 9be81a6

3 files changed

Lines changed: 117 additions & 0 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.baeldung.algorithms.linkedlist;
2+
3+
public class LinkedListReversal {
4+
5+
ListNode reverseList(ListNode head) {
6+
ListNode previous = null;
7+
ListNode current = head;
8+
while (current != null) {
9+
ListNode nextElement = current.getNext();
10+
current.setNext(previous);
11+
previous = current;
12+
current = nextElement;
13+
}
14+
return previous;
15+
}
16+
17+
ListNode reverseListRecursive(ListNode head) {
18+
if (head == null) {
19+
return null;
20+
}
21+
if (head.getNext() == null) {
22+
return head;
23+
}
24+
ListNode node = reverseListRecursive(head.getNext());
25+
head.getNext().setNext(head);
26+
head.setNext(null);
27+
return node;
28+
}
29+
30+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.baeldung.algorithms.linkedlist;
2+
3+
public class ListNode {
4+
5+
private int data;
6+
private ListNode next;
7+
8+
ListNode(int data) {
9+
this.data = data;
10+
this.next = null;
11+
}
12+
13+
public int getData() {
14+
return data;
15+
}
16+
17+
public ListNode getNext() {
18+
return next;
19+
}
20+
21+
public void setData(int data) {
22+
this.data = data;
23+
}
24+
25+
public void setNext(ListNode next) {
26+
this.next = next;
27+
}
28+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.baeldung.algorithms.linkedlist;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.assertEquals;
6+
import static org.junit.Assert.assertNotNull;
7+
8+
public class LinkedListReversalUnitTest {
9+
@Test
10+
public void givenLinkedList_whenIterativeReverse_thenOutputCorrectResult() {
11+
ListNode head = constructLinkedList();
12+
ListNode node = head;
13+
for (int i = 1; i <= 5; i++) {
14+
assertNotNull(node);
15+
assertEquals(i, node.getData());
16+
node = node.getNext();
17+
}
18+
LinkedListReversal reversal = new LinkedListReversal();
19+
node = reversal.reverseList(head);
20+
for (int i = 5; i >= 1; i--) {
21+
assertNotNull(node);
22+
assertEquals(i, node.getData());
23+
node = node.getNext();
24+
}
25+
}
26+
27+
@Test
28+
public void givenLinkedList_whenRecursiveReverse_thenOutputCorrectResult() {
29+
ListNode head = constructLinkedList();
30+
ListNode node = head;
31+
for (int i = 1; i <= 5; i++) {
32+
assertNotNull(node);
33+
assertEquals(i, node.getData());
34+
node = node.getNext();
35+
}
36+
LinkedListReversal reversal = new LinkedListReversal();
37+
node = reversal.reverseListRecursive(head);
38+
for (int i = 5; i >= 1; i--) {
39+
assertNotNull(node);
40+
assertEquals(i, node.getData());
41+
node = node.getNext();
42+
}
43+
}
44+
45+
private ListNode constructLinkedList() {
46+
ListNode head = null;
47+
ListNode tail = null;
48+
for (int i = 1; i <= 5; i++) {
49+
ListNode node = new ListNode(i);
50+
if (head == null) {
51+
head = node;
52+
} else {
53+
tail.setNext(node);
54+
}
55+
tail = node;
56+
}
57+
return head;
58+
}
59+
}

0 commit comments

Comments
 (0)