package com.coding.basic;
import java.util.NoSuchElementException;
public class LinkedList implements List {
private Node first;
private Node last;
private int size = 0;
public void add(Object o){
if(null == first){
//当链表元素为空时,新建一个Node
Node node = new Node();
node.data = o;
node.next = null;
first = node;
last = node;
size ++;
}else{
addLast(o);
}
}
public void add(int index , Object o){
if(index < 0 || index >= size){
//数组越界异常
throw new IndexOutOfBoundsException();
}else{
if(0 == index){
//1.如果加在头上
addFirst(o);
}else{
//2.加在中间位置
Node node = first.next;
int nodeIndex = 1;
if(nodeIndex == index){
//如果是第二个位置的话
Node nodeAdd = new Node();
nodeAdd.data = o;
first.next = nodeAdd;
nodeAdd.next = node;
last = node;
size ++;
}
//第三个位置及以后、开始遍历所有的索引
while(null != node.next){
//保留遍历中node之前的结点
Node nodeLast = node;
node = node.next;
nodeIndex++;
if(nodeIndex == index){
Node nodeAdd = new Node();
nodeAdd.data = o;
nodeLast.next = nodeAdd;
nodeAdd.next = node;
size ++;
break;
}
}
}
}
}
public Object get(int index){
if(index < 0 || index >= size){
//数组越界异常
throw new IndexOutOfBoundsException();
}else{
if(0 == index){
//1.如果加在头上
return first.data;
}
Node node = first.next;
int nodeIndex = 1;
if(nodeIndex == index){
//如果是第二个位置的话
return node.data;
}
//第三个位置及以后、开始遍历所有的索引
while(null != node.next){
//保留遍历中node之前的结点
node = node.next;
nodeIndex++;
if(nodeIndex == index){
return node.data;
}
}
}
throw new IndexOutOfBoundsException();
}
public Object remove(int index){
if(index < 0 || index >= size){
//数组越界异常
throw new IndexOutOfBoundsException();
}else{
if(0 == index){
//1.如果移除头
removeFirst();
}else if(index == (size - 1)){
//2.移除尾
removeLast();
}else{
//3.移除中间位置
Node node = first.next;
//从first的零号索引开始
int nodeIndex = 1;
//开始遍历所有的索引,记住要移除的索引位数据的前后结点
Node lastNode = first;
if(index == nodeIndex){
//第一次不匹配则后续的循环执行
Object o = node.data;
lastNode.next = node.next;
size--;
return o;
}else{
while(null != node.next){
lastNode = node;
node = node.next;
nodeIndex++;
if(index == nodeIndex){
Object o = node.data;
lastNode.next = node.next;
size--;
return o;
}
}
}
}
}
throw new IndexOutOfBoundsException();
}
public int size(){
return size;
}
public void addFirst(Object o){
Node node = new Node();
node.data = o ;
node.next = first;
first = node;
size++;
}
public void addLast(Object o){
Node node = new Node();
node.data = o ;
node.next = null;
last.next = node;
last = node;
size++;
}
public Object removeFirst(){
Object o = first.data;
Node node = first.next;
first = node;
size--;
return o;
}
public Object removeLast(){
if(0 == size){
throw new NoSuchElementException();
}else if(1 == size){
//只有一个元素
removeFirst();
}else{
//第二个元素
Node node = first.next;
if(null == node.next){
Object o = node.data;
last = first;
first.next = null;
return o;
}else{
while(null != node.next){
//若不止只有2个 ,记录最后一个结点的前一个。
Node lastNode = node;
node = node.next;
if(null == node.next){
Object o = node.data;
lastNode.next = null;
last = lastNode;
size--;
return o;
}
}
}
}
throw new NoSuchElementException();
}
public Iterator iterator(){
return null;
}
private static class Node{
Object data;
Node next;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if(null != first){
sb.append(first.data.toString() + ",");
Node node = first.next;
sb.append(node.data.toString() + ",");
while(null != node.next){
node = node.next;
sb.append(node.data.toString() + ",");
}
}
return sb.toString();
}
}