package com.github.lqingchenl.coding2017.basic;
public class LinkedList implements List {
private int size = 0;
private Node head;
public void add(Object o) {
if (head == null) {
head = new Node(o);
} else {
Node nextNode = head;
while (nextNode.next != null) {
nextNode = nextNode.next;
}
nextNode.next = new Node(o);
}
size++;
}
public void add(int index, Object o) {
if (index == 0) {
addFirst(o);
return;
}
Node oldNode = getNode(index - 1);
Node newNode = new Node(o);
newNode.next = oldNode.next;
oldNode.next = newNode;
size++;
}
public Object get(int index) {
Node node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node.data;
}
public Node getNode(int index) {
Node node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
public Object remove(int index) {
if (index == 1) {
return removeFirst();
}
Node fatherNode = getNode(index - 2);
Node oldNode = getNode(index - 1);
fatherNode.next = oldNode.next;
size--;
return oldNode.data;
}
public int size() {
return size;
}
public void addFirst(Object o) {
Node newNode = new Node(o);
newNode.next = head;
head = newNode;
size++;
}
public void addLast(Object o) {
if (head == null) {
addFirst(o);
return;
}
Node newNode = new Node(o);
Node lastNode = getNode(size - 1);
lastNode.next = newNode;
size++;
}
public Object removeFirst() {
Node oldHead = head;
Node secondNode = head.next;
head = secondNode;
size--;
return oldHead.data;
}
public Object removeLast() {
if (size == 1) {
return removeFirst();
}
Object data = get(size - 1);
Node oldNode = getNode(size - 2);
oldNode.next = null;
size--;
return data;
}
public Iterator iterator() {
return null;
}
private static class Node {
Object data;
Node next;
public Node(Object data) {
this.data = data;
}
}
}