package wiki.liven.code.dataStructures;
/**
* Created by leven on 2017/2/21.
*/
public class LinkedList implements List{
private Node head;//链表的头节点
private Node tail;//链接的尾节点
private int size;//定义了链表中的元素的个数
/**
* 定义了NODE节点的数据结构
*/
private static class Node{
Object data;
Node next;
private Node(){
}
private Node(Object o,Node node){
this.data = o;
this.next = node;
}
}
/**
* 在指定的索引写入新的节点
* 1.找到给位置上的节点node0
* 2.修改node0的next指向新的节点node
* 3.新节点node指向原先node0的后继节点node1
* 4.长度++
* 5.完结
* @param index 索引 从0开始
* @param o
*/
@Override
public void add(int index, Object o) {
if (index<0||index>size-1)
throw new IndexOutOfBoundsException("单链表越界异常。");
Node node = new Node();
node.data = o;
Node nodeIndex = findNodeByIndex(index);
if(node==null)
throw new NullPointerException("空指针异常。");
Node temp = nodeIndex.next;
nodeIndex.next = node;
node.next = temp;
size++;
}
/**
* 根据索引号查询节点
* @param index 索引
* @return
*/
private Node findNodeByIndex(int index) {
if (index<0||index>size-1)
throw new IndexOutOfBoundsException("单链表越界异常。");
Node current = head;
if (1<=index&&index<=size-1){//索引检查
for (int i = 0;i>=size-1&¤t!=null;i++,current = current.next)
if (i==index){
return current;
}
}
return null;
}
@Override
public void add(Object o) {
Node node = new Node();
node.data = o;
if(head==null){
head = node;
node.next = tail;
size++;
}else{
Node temp = tail;
node.next = temp;
temp.next = node;
size++;
}
}
@Override
public Object get(int index) {
if(index<0||index>size-1)
throw new IndexOutOfBoundsException("单链表越界。");
Node node = findNodeByIndex(index);
if(node==null)
throw new NullPointerException("空指针异常。");
return node.data;
}
/**
* 删除指定索引的元素
* @param index
* @return
*/
@Override
public Object remove(int index) {
if(index<0||index>size-1)
throw new IndexOutOfBoundsException("单链表越界。");
Node node = findNodeByIndex(index);
if(node==null)
throw new NullPointerException("空指针异常。");
Node prvNode = findNodeByIndex(index-1);
if(prvNode==null)
throw new NullPointerException("空指针异常。");
Node nextNode = node.next;
node.next = null;
prvNode.next = nextNode;
size--;
return node.data;
}
@Override
public int size() {
return size;
}
}