Here is my implementation of a doubly linked list. Basic functionality seems to be working fine. Please let me know your comments on the coding style and algo.
DoublyLinkedListNode.java
public class DoublyLinkedListNode<T>
{
private T DataItem;
private DoublyLinkedListNode<T> nextNode;
private DoublyLinkedListNode<T> prevNode;
public DoublyLinkedListNode(DoublyLinkedListNode<T> prevNode, T DataItem, DoublyLinkedListNode<T> nextNode)
{
this.DataItem=DataItem;
this.nextNode=nextNode;
this.prevNode=prevNode;
}
public void setNextNode(DoublyLinkedListNode<T> nextNode)
{
this.nextNode=nextNode;
}
public DoublyLinkedListNode<T> getNextNode()
{
return nextNode;
}
public void setDataItem(T DataItem){
this.DataItem=DataItem;
}
public T getDataItem()
{
return DataItem;
}
public void setPrevNode(DoublyLinkedListNode<T> prevNode)
{
this.prevNode=prevNode;
}
public DoublyLinkedListNode<T> getPrevNode()
{
return prevNode;
}
}
MyDoublyLinkedList.java
public class MyDoublyLinkedList<T>{
private DoublyLinkedListNode<T> head;
private int size;
public MyDoublyLinkedList(){
head=new DoublyLinkedListNode<T>(null,null,null);
}
public void prependElement(T data){
addElementAtIndex(0,data);
}
public void addElementAtIndex(int index, T data){
if(index == 0){
DoublyLinkedListNode<T> newNode=new DoublyLinkedListNode<T>(head,data,head.getNextNode());
head.setNextNode(newNode);
size++;
}else{
DoublyLinkedListNode<T> prevNode=nodeAtIndex(index-1);
if(prevNode != null){
DoublyLinkedListNode<T> nextNode=prevNode.getNextNode();
DoublyLinkedListNode<T> newNode=new DoublyLinkedListNode<T>(prevNode,data,nextNode);
prevNode.setNextNode(newNode);
nextNode.setPrevNode(newNode);
size++;
}else{
System.err.println("Index greater than the size of the list");
}
}
}
// delete node at the beginning of the list
public void removeElement(){
removeElementAtIndex(0);
}
// delete a node at index
public void removeElementAtIndex(int index){
if(index == 0)
{
DoublyLinkedListNode<T> toBeDeletedNode=head.getNextNode();
if(toBeDeletedNode != null){
DoublyLinkedListNode<T> nextNode=toBeDeletedNode.getNextNode();
head.setNextNode(nextNode);
nextNode.setPrevNode(head);
toBeDeletedNode.setNextNode(null);
toBeDeletedNode.setPrevNode(null);
size--;
}else{
System.out.println("No nodes to be deleted");
}
}else{
DoublyLinkedListNode<T> prevNode=nodeAtIndex(index-1);
if(prevNode != null){
DoublyLinkedListNode<T> targetNode=prevNode.getNextNode();
DoublyLinkedListNode<T> nextNode=targetNode.getNextNode();
targetNode.setNextNode(null);
targetNode.setPrevNode(null);
prevNode.setNextNode(nextNode);
nextNode.setPrevNode(prevNode);
size--;
}else{
System.err.println("Index greater than the size of the list");
}
}
}
// display all nodes data
public void displayAllElements(){
DoublyLinkedListNode<T> nodes=head.getNextNode();
int i=0;
while(nodes != null){
System.out.println("Node "+i+" : "+nodes.getDataItem().toString());
nodes=nodes.getNextNode();
i++;
}
}
// reverse order of linked list
public void reverse(){
DoublyLinkedListNode<T> currentNode=head.getNextNode();
DoublyLinkedListNode<T> prevNode;
DoublyLinkedListNode<T> nextNode;
while(currentNode != null){
nextNode=currentNode.getNextNode();
prevNode=currentNode.getPrevNode();
currentNode.setNextNode(prevNode);
currentNode.setPrevNode(nextNode);
if(currentNode.getNextNode() == head){
currentNode.setNextNode(null);
}
if(currentNode.getPrevNode() == null){
currentNode.setPrevNode(head);
head.setNextNode(currentNode);
currentNode=null;
}else{
currentNode=currentNode.getPrevNode();
}
}
}
public int searchKey(T key){
T data=null;
int i=0;
DoublyLinkedListNode<T> node=head.getNextNode();
Boolean foundFlag=false;
while(node != null){
data=node.getDataItem();
if(data.equals(key)){
return i;
}
i++;
node=node.getNextNode();
}
return -1;
}
// return data item at particular node
public T dataAtIndex(int index)
{
DoublyLinkedListNode<T> nodes=nodeAtIndex(index);
if(nodes != null){
return nodes.getDataItem();
}else{
return null;
}
}
// return node at particular index
private DoublyLinkedListNode<T> nodeAtIndex(int index){
if(index<0){
return null;
}else{
DoublyLinkedListNode<T> nodes=head.getNextNode();
int i=0;
while(i < index && nodes != null){
nodes=nodes.getNextNode();
i++;
}
return nodes;
}
}
public int size(){
return size;
}
}