package com.coding.basic.first.impl;
import com.coding.basic.first.List;
/**
* 链表
* @author zap
* LinkedList
*/
public class LinkedList implements List {
private Node head = new Node();
private int size ;//
private static class Node{
Object data;
Node next;
public Node() {
}
public Node(Object data) {
this.data = data;
}
}
@Override
public void add(Object o) {
if(size==0){
Node node = new Node(o);
head = node;
// head = tail = node;
}else{
Node current = getCurrentNode(size);
Node node = new Node(o);
current.next = node;
// tail = node;
}
size ++;
}
@Override
public void add(int index, Object o) {
judgeIndexRangge(index);
if(size == 0 ){
Node node = new Node(o);
head = node;
// head = tail = node;
}else if(index == 0){
Node node = new Node(o);
node.next = head;
head = node;
}else{
Node prev = getCurrentNode(index);
Node temp = prev.next;
Node node = new Node(o);
node.next = temp;
prev.next = node;
}
size ++;
}
@Override
public Object get(int index) {
judgeGetIndexRangge(index);
Node current = getCurrentNode(index + 1);
return current.data;
}
@Override
public Object remove(int index) {
judgeIndexRangge(index);//下标
Object obj = null;
if(index == 0){
Node node = head.next;
obj = head.data;
head = node;
}else{
Node prev = getCurrentNode(index);
Node temp = prev.next;
Node after =temp.next ;
prev.next = after;
obj = temp.data;
}
size -- ;
return obj;
}
@Override
public int size() {
return size;
}
private void judgeIndexRangge(int index){
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private void judgeGetIndexRangge(int index){
if (index >= size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
private Node getCurrentNode(int index){
Node temp = head;
Node prev = head;
for(int i = 0 ;i < index;i++){//找到该个元素
prev = temp;//
temp = temp.next;//
}
return prev;
}
public void addLast(Object o){
add(o);
}
public Object removeFirst(){
Object o = remove(0);
return o;
}
}