package com.interview.linklist;
class NodeRef{
Node node;
public void next(){
node = node.next;
}
}
class Node{
int data;
Node next;
Node before;
Node child;
Object obj;
public static Node newNode(int data, Object... obj){
Node n = new Node();
n.data = data;
n.next = null;
n.before = null;
if(obj.length > 0)
{
n.obj = obj[0];
}
return n;
}
}
public class LinkList {
public Node addNode(int data, Node head, Object... obj){
Node temp = head;
Node n = null;
if(obj.length > 0){
n = Node.newNode(data, obj[0]);
}else{
n = Node.newNode(data);
}
if(head == null){
return n;
}
while(head.next != null){
head = head.next;
}
head.next = n;
return temp;
}
public Node addAtFront(Node node, Node head){
if(head == null){
return node;
}
node.next = head;
return node;
}
public Node reverse(Node head){
Node front = null;
Node middle = head;
Node end = null;
while(middle != null){
end = middle.next;
middle.next = front;
front = middle;
middle = end;
}
return front;
}
public Node reverseRecursiveEasy(Node head){
if(head == null || head.next == null){
return head;
}
Node reversedList = reverseRecursiveEasy(head.next);
head.next.next = head;
head.next = null;
return reversedList;
}
public void reverseRecursive(NodeRef headRef){
if(headRef.node == null){
return;
}
Node first = headRef.node;
Node last = headRef.node.next;
if(last == null){
return;
}
NodeRef lastHeadRef = new NodeRef();
lastHeadRef.node = last;
reverseRecursive(lastHeadRef);
first.next.next = first;
first.next = null;
headRef.node = lastHeadRef.node;
}
public Node addAtFront(int data, Node head){
Node node = Node.newNode(data);
return addAtFront(node,head);
}
public void printList(Node head){
while(head != null){
System.out.println(head.data);
head = head.next;
}
}
public Node find(Node head, int data){
while(head != null){
if(head.data == data){
return head;
}
head = head.next;
}
return null;
}
public int size(Node head){
int size =0;
while(head != null){
size++;
head = head.next;
}
return size;
}
public static void main(String args[]){
LinkList ll = new LinkList();
Node head = null;
head = ll.addNode(1, head);
head = ll.addNode(2, head);
head = ll.addNode(3, head);
head = ll.addNode(4, head);
head = ll.addNode(5, head);
head = ll.addNode(6, head);
ll.printList(head);
// NodeRef headRef = new NodeRef();
// headRef.node = head;
// ll.reverseRecursive(headRef);
// head = headRef.node;
// ll.printList(head);
System.out.println();
head = ll.reverseRecursiveEasy(head);
ll.printList(head);
}
}