class DoublyLinkedList{
Node head;
Node tail;
int length;
class Node
{
int value;
Node next;
Node prev;
Node(int value)
{
this.value = value;
}
}
DoublyLinkedList(int value)
{
Node newNode = new Node(value);
head = newNode;
tail = newNode;
length = 1;
}
public void printList()
{
Node temp = head;
while(temp!=null)
{
System.out.print(temp.value+" ");
temp = temp.next;
}
}
public void getHead()
{
System.out.println("Head: "+head.value);
}
public void getTail()
{
System.out.println("Tail: "+head.value);
}
public void getLength()
{
System.out.println("Length: "+length);
}
public void append(int value)
{
Node newNode = new Node(value);
if(length == 0)
{
head = newNode;
tail = newNode;
}
else
{
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
}
length++;
}
public Node removeLast()
{
if(length == 0)
{
return null;
}
Node temp = tail;
if(length == 1)
{
head = null;
tail = null;
}
else
{
tail = temp.prev;
temp.prev = null;
tail.next = null;
}
length--;
return temp;
}
public void prepend(int value)
{
Node newNode = new Node(value);
if(length == 0)
{
head = newNode;
tail = newNode;
}
else
{
head.prev = newNode;
newNode.next = head;
head = newNode;
}
length++;
}
public Node removeFirst()
{
if(length == 0)
{
return null;
}
Node temp = head;
if(length == 1)
{
head = null;
tail = null;
}
else
{
head = temp.next;
temp.next = null;
head.prev = null;
}
length--;
return temp;
}
public Node get(int index)
{
if(index<0 || index>length)
{
return null;
}
else
{
if(index < length/2)
{
Node temp = head;
for(int i=0;i<index;i++)
{
temp=temp.next;
}
return temp;
}
else
{
Node temp = tail;
for(int i=length-1;i>index;i--)
{
temp = temp.prev;
}
return temp;
}
}
}
public boolean insert(int index,int value)
{
if(index < 0 || index > length)
{
return false;
}
else if(index == 0)
{
prepend(value);
return true;
}
else
{
Node newNode = new Node(value);
Node before = get(index-1);
Node after = get(index);
before.next = newNode;
before=newNode.prev;
newNode.next = after;
after.prev = newNode;
length++;
return true;
}
}
public boolean set(int index, int value)
{
Node temp = get(index);
if(temp!=null)
{
temp.value=value;
return true;
}
return false;
}
public Node remove(int index)
{
if(index < 0 || index > length)
{
return null;
}
if(index == length-1)
{
return removeLast();
}
if(index==0)
{
return removeFirst();
}
Node temp = get(index);
Node before = get(index-1);
Node after = get(index+1);
temp.next=null;
temp.prev=null;
before.next=after;
after.prev=before;
length--;
return temp;
}
}
class Main {
public static void main(String[] args) {
DoublyLinkedList newDoublyLinkedList = new DoublyLinkedList(4);
newDoublyLinkedList.append(1);
newDoublyLinkedList.append(2);
newDoublyLinkedList.append(3);
newDoublyLinkedList.append(4);
newDoublyLinkedList.remove(0);
// newDoublyLinkedList.set(5,0);
// newDoublyLinkedList.insert(4,7);
// System.out.println("index is: "+newDoublyLinkedList.get(4).value);
// newDoublyLinkedList.prepend(3);
// System.out.println("Removed node: "+newDoublyLinkedList.removeFirst().value);
// System.out.println("Removed node is :"+newDoublyLinkedList.removeLast().value);
// System.out.println("Removed node is :"+newDoublyLinkedList.removeLast().value);
// System.out.println("Removed node is :"+newDoublyLinkedList.removeLast().value);
// System.out.println("Removed node is :"+newDoublyLinkedList.removeLast().value);
newDoublyLinkedList.printList();
// newDoublyLinkedList.getHead();
// newDoublyLinkedList.getTail();
// newDoublyLinkedList.getLength();
}
}