I am currently reading about the thread-safe implementation of a linked list. Although I implemented this linked list while keeping in mind the issues from the first code review (Binary Tree). I would like someone to point out some mistakes that will create issues if I try to make it thread-safe in the future.
package com.atleyvirdee.myDataStructures.linkedlist.implemtations;
import com.atleyvirdee.myDataStructures.linkedlist.ILinkedList;
import com.atleyvirdee.myDataStructures.linkedlist.ILinkedListNode;
import com.atleyvirdee.myDataStructures.linkedlist.LinkedListerTraverser;
public class SinglyLinkedList<T extends Comparable<T>> implements ILinkedList<T> {
ILinkedListNode<T> root = null;
ILinkedListNode<T> last = null;
int size = 0;
LinkedListerTraverser<T> traverser = new LinkedListerTraverser<T>(root);
@Override
public ILinkedListNode<T> getRoot() {
return root;
}
@Override
public LinkedListerTraverser<T> getTraverser() {
traverser.setRoot(root);;
return traverser;
}
@Override
public void prepend( T data ) {
size++;
if ( this.root == null ) {
append(data);
return;
}
ILinkedListNode<T> node = new NodeImpl<T>(data);
node.setNext(this.root);
this.root = node;
}
@Override
public void append( T data ) {
size++;
ILinkedListNode<T> node = new NodeImpl<T>(data);
if ( this.root == null ) {
this.root = node;
this.last = node;
return;
}
this.last.setNext(node);
this.last = node;
}
@Override
public void remove( T data ) {
ILinkedListNode<T> parent = null;
ILinkedListNode<T> node = root;
ILinkedListNode<T> child = root.getNext();
if(root != null && root.getData() == data){
root = root.getNext();
return;
}
while (node.getData() != data) {
parent = node;
node = node.getNext();
child = node.getNext();
}
parent.setNext(child);
node.setNext(null);
}
@Override
public void insertAfter( int index, T data ) {
if(index > size){
throw new RuntimeException("Out of Bound Exception. index:"+index+" is more then the Size of LinkedList:"+size);
}
ILinkedListNode<T> node = root;
while (node != null && index > 0) {
index--;
node = node.getNext();
}
size++;
ILinkedListNode<T> newNode = new NodeImpl<T>(data);
newNode.setNext(node.getNext());
node.setNext(newNode);
}
@Override
public T find( T data ) {
ILinkedListNode<T> node = root;
while (node != null && node.getData() != data) {
node = node.getNext();
}
return (node == null) ? null : node.getData();
}
class NodeImpl<E extends Comparable<E>> implements ILinkedListNode<E> {
private ILinkedListNode<E> nextNode;
private E data;
public NodeImpl( E data ) {
this.data = data;
}
@Override
public ILinkedListNode<E> getNext() {
return this.nextNode;
}
@Override
public void setNext( ILinkedListNode<E> node ) {
this.nextNode = node;
}
@Override
public E getData() {
return data;
}
@Override
public void setData( E data ) {
this.data = data;
}
}
}
ILinkedListNode<T> child = root.getNext();
the testroot != null
comes) and write at least some elementary tests). Obviously, you haven't even triednew SinglyLinkedList<String>().remove("")
as it surely throws. Testing everything properly is hard, but writing some tests is simple and necessary as you can see. – maaartinus Jun 22 at 19:23