Given a LinkedList reverse it
1. Iterative.
2. Recursive.
1. Iterative.
2. Recursive.
/**
* @author vikky.agrawal
* Link List reversal | Iterative and Recursive.
*/
public class LinkedList {
Node node = null;
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.operations();
}
public void operations() {
this.node = new Node(10);
for (int i = 1; i < 6; i++) {
add(node, (int) (Math.random() * 100));
}
System.out.println("Test: iterative, List before reversal");
print(node);
this.node=reverse(node);
System.out.println("Test: recursive, List before reversal");
print(node);
this.node=this.recursiveReverse(node);
System.out.println("After recursice reverse list is : ");
print(node);
}
/**
* Reverse a linked list iterative.
* Using auxiliary pointers.
*/
public Node reverse(Node ptr) {
if (ptr == null) {
System.out.println("List is empty:returning");
return null;
}
Node ptr1 = ptr;
Node ptr2 = ptr;
Node ptr3 = null;
while (ptr1.getLink() != null) {
ptr2 = ptr1;
ptr1 = ptr1.getLink();
ptr2.setLink(ptr3);
ptr3 = ptr2;
}
ptr1.setLink(ptr2); //setting link for the last node;
System.out.println("Reversed List :");
this.print(ptr1);
return ptr1;
}
/**
* RecursiveReverse()
* Use cases:
* What is the reverse of null (the empty list)? null.
* What is the reverse of a one element list? the element.
* What is the reverse of an n element list?
* the reverse of the second element on
* followed by the first element.
*/
public Node recursiveReverse(Node root) {
// base case
if (root == null || root.getLink() == null) {
return root;
}
Node temp = recursiveReverse(root.getLink());
// temp contains last element when recursion done
// take 2 nodes and dry-run
root.getLink().setLink(root);
root.setLink(null);
return temp;
}
/**
* Print reverse of the link list
* reccursively
*/
public void printReverseRecursive(Node root){
if(root.getLink()!=null){
printReverseRecursive(root.getLink());
System.out.println(root.getData());
}else{
System.out.println(root.getData());
}
}
/**
* Helper functions for LinkedList
*/
public void add(Node ptr, int data) {
if (ptr == null) {
System.out.println("Always null ?");
ptr = new Node(data);
} else {
Node newptr = ptr;
while (newptr.getLink() != null) {
newptr = newptr.getLink();
}
newptr.setLink(new Node(data));
newptr.getLink().setLink(null);
}
}
public void print(Node ptr) {
if (ptr == null) {
return;
}
Node ptr1 = ptr;
System.out.print(ptr1.getData() + "->");
while ((ptr1 = ptr1.getLink()) != null) {
System.out.print(ptr1.getData() + "->");
}
System.out.println("/n");
}
public int size(Node ptr) {
if (ptr == null) {
return -1;
}
Node ptr1 = ptr;
int i = 1;
while ((ptr1 = ptr1.getLink()) != null) {
i++;
}
return i;
}
/**
* static inner class for LinkedList
* Data Structure
*/
private static class Node{
private int data;
private Node link;
Node(){
}
Node(int data){
//mergedList=new Node();
this.setData(data);
this.setLink(null);
}
public int getData(){
return this.data;
}
public Node getLink(){
return this.link;
}
public void setData(int data){
this.data=data;
}
public void setLink(Node link){
this.link=link;
}
}
}