public class Node
{
private int data;
private Node prev;
private Node next;
public Node()
{
data = 0;
prev = null;
next = null;
}
public int getData()
{
return data;
}
public Node getPrev()
{
return prev;
}
public Node getNext()
{
return next;
}
public void setData(int d)
{
data = d;
}
public void setPrev(Node p)
{
prev = p;
}
public void setNext(Node l)
{
next = l;
}
}
public class List
{
private Node head;
private Node tail;
private int count;
public List()
{
head = null;
tail = null;
count = 0;
}
public boolean isEmpty()
{
return (count == 0);
}
public int getSize()
{
return count;
}
public int getElement(int index)
{
if(index < 0 || index > count) return -1;
Node walker;
if(index < (count/2))
{
walker = head;
for(int i = 0; i < index; i++)
walker = walker.getNext();
}
else
{
walker = tail;
for(int i = 0; i < (count-index-1); i++)
walker = walker.getPrev();
}
return walker.getData();
}
public String toString()
{
String str = "[";
Node walker = head;
while(walker != null)
{
str = str + " " + walker.getData();
walker = walker.getNext();
}
return str+" ]";
}
public boolean search(int element)
{
Node walker = head;
while(walker != null && walker.getData() != element)
walker = walker.getNext();
if(walker == null)
return false;
else
return true;
}
public boolean insert(int element, int index)
{
if(index < 0 || index > count)
return false;
Node newNode = new Node();
newNode.setData(element);
//insert the first node
if(count == 0)
{
head = newNode;
tail = newNode;
count++;
return true;
}
//insert in the front
if(index == 0)
{
newNode.setNext(head);
head.setPrev(newNode);
head = newNode;
count++;
return true;
}
//insert in the end
if(index == count)
{
newNode.setPrev(tail);
tail.setNext(newNode);
tail = newNode;
count++;
return true;
}
//insert in the middle
Node walker;
if(index < (count/2))
{
walker = head;
for(int i = 0; i < index-1; i++)
walker = walker.getNext();
}
else
{
walker = tail;
for(int i = 0; i < (count-index); i++)
walker = walker.getPrev();
}
System.out.println("Walk to the destnition ...");
newNode.setNext(walker.getNext());
newNode.setPrev(walker);
walker.getNext().setPrev(newNode);
walker.setNext(newNode);
count++;
return true;
}
public boolean delete(int index)
{
if(index < 0 || index > count-1)
return false;
//delete the last node
if(count == 1)
{
head = tail = null;
count--;
return true;
}
//delete the first node
if(index == 0)
{
head = head.getNext();
head.setPrev(null);
count--;
return true;
}
//delete the last node
if(index == count-1)
{
tail = tail.getPrev();
tail.setNext(null);
count--;
return true;
}
//delete the middle node
Node walker;
if(index < (count/2))
{
walker = head;
for(int i = 0; i < index-1; i++)
walker = walker.getNext();
}
else
{
walker = tail;
for(int i = 0; i < (count-index); i++)
walker = walker.getPrev();
}
walker.getNext().getNext().setPrev(walker);
walker.setNext(walker.getNext().getNext());
count--;
return true;
}
}
import java.util.Random;
public class ListTest
{
public static void main(String args[])
{
Random r = new Random();
List l = new List();
//insert elements
for(int i = 0; i < 10; i++)
l.insert(r.nextInt(100), i);
System.out.println("Size: "+l.getSize()+" - "+l);
//insert
l.insert(100, 0);//insert in the front
l.insert(200, 5);//insert in the middle
l.insert(300, 12);//insert in the end
System.out.println("Size: "+l.getSize()+" - "+l);
//delete
l.delete(12);//delete the end
l.delete(0);//delete the front
l.delete(5);//delete the middle
System.out.println("Size: "+l.getSize()+" - "+l);
for(int i = 0, len = l.getSize(); i < len; i++)
{
l.delete(0);
System.out.println("Size: "+l.getSize()+" - "+l);;
}
}
}