package com.coding.basic;
/**
* 实现 LinkedList - 第一次作业
* @author stackwei
* @date 2017/2/25
* @status ok
*/
public class LinkedList implements List {
private Node head = null;
private Node last = null;
private int size = 0;
private static class Node {
Object item;
Node prev;
Node next;
public Node(Node prev, Object item, Node next) {
this.prev = prev;
this.item = item;
this.next = next;
}
}
@Override
public void add(Object element) {
addLast(element);
}
@Override
public void add(int index, Object element) {
if (index < 0 || index > size) {
System.out.println("操作无效,越界了");
return;
}
if (index == 0) {
addFirst(element);
return;
}
if (index == size) {
addLast(element);
return;
}
Node indexNode = node(index);
Node newNode = new Node(indexNode.prev, element, indexNode);
indexNode.prev.next = newNode;
indexNode.prev = newNode;
size++;
}
@Override
public Object get(int index) {
if (index < 0 || index >= size) {
System.out.println("查询无效,越界了");
return null;
}
if (index == 0) {
return head.item;
}
return node(index).item;
}
@Override
public Object remove(int index) {
if (index < 0 || index > size) {
System.out.println("是空的,无法删除");
return null;
}
if (index == 0) {
return removeFirst();
}
if (index == size - 1) {
return removeLast();
}
Node x = node(index);
final Object element = x.item;
final Node next = x.next;
final Node prev = x.prev;
if (prev == null) {
head = next;
} else {
prev.next = next;
x.prev = null;
}
if (next == null) {
last = prev;
} else {
next.prev = prev;
x.next = null;
}
x.item = null;
size--;
return element;
}
@Override
public int size() {
return size;
}
private void addFirst(Object element) {
final Node f = head;
Node newNode = new Node(null, element, f);
head = newNode;
if (f == null)
last = newNode;
else
f.prev = newNode;
size++;
}
public void addLast(Object element) {
if (head == null) {
addFirst(element);
} else {
Node newNode = new Node(last, element, null);
last.next = newNode;
last = newNode;
size++;
}
}
public Object removeFirst() {
if (head == null) {
System.out.println("是空的,无法删除");
return null;
} else {
Node x = head;
Node next = head.next;
Object element = x.item;
x.item = null;
x.next = null;
head = next;
if (next == null)
last = null;
else
x.prev = null;
size--;
return element;
}
}
public Object removeLast() {
if (last == null) {
System.out.println("是空的,无法删除");
return null;
} else {
final Node l = last;
final Object element = l.item;
final Node p = l.prev;
l.item = null;
l.prev = null;
last = p;
if (p == null)
head = null;
else
p.next = null;
size--;
return element;
}
}
Node node(int index) {
if (index < (size >> 1)) {
Node x = head;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
/**
* 测试用例
*
* @param args
*/
public static void main(String[] args) {
LinkedList ll = new LinkedList();
ll.add(0, "xxx");
ll.add(1, 111);
System.out.println(ll.size());
System.out.println(ll.get(2));
}
}