package com.coding.basic;
import java.util.NoSuchElementException;
public class LinkedList implements List {
private int size = 0;
private Node head;
public Node getHead() {
return head;
}
public LinkedList() {
this.head = new Node();
}
@Override
public String toString() {
return "[" + head + "]";
}
private void outOfBoundsForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException("数组下标越界");
}
private void outOfBoundsForOther(int index) {
if (index >= size || index < 0)
throw new IndexOutOfBoundsException("数组下标越界");
}
public void add(Object o) {
Node node = head;
while (node.next != null) {
node = node.next;
}
node.next = new Node(o);
size++;
}
public void add(int index, Object o) {
outOfBoundsForAdd(index);
if(size == index)
add(o);
else{
Node prevNode = head;
for (int i = 0; i < index; i++) {
prevNode = prevNode.next;
}
Node nextNode = prevNode.next;
Node node = new Node(o);
prevNode.next = node;
node.next = nextNode;
size++;
}
}
public Object get(int index) {
outOfBoundsForOther(index);
Node node = head;
for (int i = 0; i <= index; i++) {
node = node.next;
}
return node.data;
}
public Object remove(int index) {
outOfBoundsForOther(index);
Node prevNode = head;
for (int i = 0; i < index; i++) {
prevNode = prevNode.next;
}
Node node = prevNode.next;
prevNode.next = node.next;
size--;
return node.data;
}
public int size() {
return size;
}
public void addFirst(Object o) {
Node newNode = new Node(o);
Node node = head.next;
head.next = newNode;
newNode.next = node;
size++;
}
public void addLast(Object o) {
Node node = head;
while (node.next != null) {
node = node.next;
}
node.next = new Node(o);
size++;
}
private void noSuchEle() {
if (head.next == null)
throw new NoSuchElementException("没有这个元素");
}
public Object removeFirst() {
noSuchEle();
Node node = head.next;
head.next = node.next;
size--;
return node.data;
}
public Object removeLast() {
noSuchEle();
Node node = head;
for(int i=0;i<size-1;i++){
node = node.next;
}
Node reNode = node.next;
node.next = null;
size--;
return reNode.data;
}
public static class Node {
Object data;
Node next;
@Override
public String toString() {
return data + ", " + next;
}
public Node() {
}
public Node(Object data) {
this.data = data;
}
}
}