public class Main<T>{
public Node<T> head = null;
public Node<T> tail = null;
public class Node<T>{
T data;
Node<T> prev = null;
Node<T> next = null;
public Node(T data){
this.data =data;
}
}
public void addNode(T data){
Node<T> input = new Node<T>(data);
if(this.head == null){
this.head =input;
this.tail = input;
return;
}else{
Node<T> node = head;
while(node.next != null){
node = node.next;
}
input.prev = node;
node.next = input;
this.tail = input;
}
}
public void printNodeAll(){
Node<T> node = null;
if(head == null){
return;
}else{
node = head;
System.out.println(node.data);
while(node.next != null){
System.out.println(node.next.data);
node = node.next;
}
}
}
public Node<T> searchFromHead(T item){
Node<T> node =null;
if(head ==null){
return null;
}else{
node = head;
if(node.data == item){
return node;
}
while(node.next !=null){
if(node.next.data == item){
return node.next;
}
node = node.next;
}
}
return null;
}
public Node<T> searchFromTail(T item){
if(this.tail == null){
return null;
}else{
Node<T> node = tail;
if(node.data == item){
return node;
}
while(node.prev != null){
if(node.prev.data == item){
return node.prev;
}
node = node.prev;
}
}
return new Node<T>(null);
}
public boolean insertNode(T idx, T item){
Node<T> origin =this.searchFromHead(idx);
Node<T> input = new Node<T>(item);
if(origin == null){
this.addNode(item);
return true;
}
if(origin.next == null){
origin.next = input;
input.prev = origin;
this.tail = input;
}else{
input.prev = origin;
input.next = origin.next;
origin.next.prev =input;
origin.next = input;
}
return true;
}
}