http://www.technicalypto.com/2010/03/reverse-singly-linked-list-recursively.html
Reverse a Singly Linked List Recursively in Java
We have already seen how to reverse a singly linked list with illustrative pictures. Now lets see how we can do it recursively. In the previous problem we did it iteratively, now we shall do it recursively.
To attack any problem in a recursive approach, we need to be very clear about the end/boundary conditions. For a linked list, reverse of a null list or reverse of list of size 1 is going to be the same.
Reverse of a linked list of size x will be the reverse of the 'next' element followed by first.
A picture means a thousand words. So, here is what happens internally.
Now for the comprehensive Java code (reference for SinglyLinkedList implementation can be found here )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package
dsa.linkedlist;
public
class
ReverseLinkedListRecursively {
public
static
void
main(String args[]){
ReverseLinkedListRecursively reverser =
new
ReverseLinkedListRecursively();
SinglyLinkedList<Integer> originalList = reverser.getLabRatList(
10
);
System.out.println(
"Original List : "
+originalList.toString());
originalList.start = reverser.reverse(originalList.start);
System.out.println(
"Reversed List : "
+originalList.toString());
}
public
Node<Integer> reverse(Node<Integer> list)
{
if
(list ==
null
|| list.next==
null
)
return
list;
Node<Integer> nextItem = list.next;
list.next =
null
;
Node<Integer> reverseRest = reverse(nextItem);
nextItem.next = list;
return
reverseRest;
}
private
SinglyLinkedList<Integer> getLabRatList(
int
count){
SinglyLinkedList<Integer> sampleList =
new
SinglyLinkedList<Integer>();
for
(
int
i=
0
;i<count;i++){
sampleList.add(i);
}
return
sampleList;
}
}
/*
* SAMPLE OUTPUT
* Original List : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
* Reversed List : 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
*/
|