package com.leaning.code;
public class LinkedList implements List {
private Node head;
private Node last;
private int size;
void linkLast(Object o){
Node lastNode = last;
Node newNode = new Node(lastNode, o, null);
last = newNode;
if (lastNode == null)
head = newNode;
else
lastNode.next = newNode;
size++;
}
void linkHead(Object o){
Node headNode = head;
Node newNode = new Node(null, o, headNode);
head = newNode;
if (head == null)
last = newNode;
else
head.prev = newNode;
size++;
}
@Override
public void add(Object o) {
linkLast(o);
}
@Override
public void add(int index, Object o) {
if (index < 0 || index >= size) {
throw new RuntimeException("�����±�Խ��");
}
Node n = find(index);
Node pred = n.prev;
Node newNode = new Node(pred, o, n);
n.prev = newNode;
if (pred == null)
head = newNode;
else
pred.next = newNode;
size++;
}
@Override
public Object get(int index) {
return find(index).item;
}
Node find(int index){
if (index < (size >> 1)) {
Node n = head;
for (int i = 0; i < index; i++)
n = n.next;
return n;
} else {
Node n = last;
for (int i = size - 1; i > index; i--)
n = n.prev;
return n;
}
}
@Override
public Object remove(int index) {
Node n = find(index);
Object o = n.item;
final Node prev = n.prev;
final Node next = n.next;
if (null != prev) {
prev.next = next;
}
if (null != next) {
next.prev = prev;
}
n.item = null;
n.next = null;
n.prev = null;
size-- ;
return o;
}
@Override
public int size() {
return size;
}
public void addFrist(Object o){
linkHead(o);
}
public void addLast(Object o){
linkLast(o);
}
public Object removeFirst(){
Object o = head.item;
Node n = head.next;
head = n;
if (n == null)
last = null;
else
n.prev = null;
size --;
return o;
}
public Object removeLaset(){
Object o = last.item;
Node p = last.prev;
last = p;
if (p == null)
head = null;
else
p.next = null;
size --;
return o;
}
public Iterator iterator(){
return null;
}
public static class Node{
Object item;
Node next;
Node prev;
Node(Node prev, Object element, Node next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
}