package com.util_1;
import java.util.NoSuchElementException;
/**
* LinkedList集合-链
* Created by 14258 on 2017/2/27.
*/
public class MyLinkedList implements MyList {
//链头
private Node first;
//链尾
private Node last;
//集合大小
private int size;
/**
* 追加元素到链表的末尾
*
* @param o
* @return
*/
@Override
public boolean add(Object o) {
linkedLast(o);
return true;
}
/**
* 插入元素到链表特定的位置,
*
* @param index
* @param o
*/
@Override
public void add(int index, Object o) {
checkRange(index);//检查index是否越界
if (index == size) {
linkedLast(o);
} else {
linkedBefore(o, node(index));
}
}
/**
* add元素时检查index范围
*
* @param index
*/
private void checkRange(int index) {
if (index < 0 && index > size) {
throw new IndexOutOfBoundsException();
}
}
/**
* 移除链表特定位置的元素
*
* @param index
* @return
*/
@Override
public Object remove(int index) {
checkRange(index);
return unLinked(node(index));
}
/**
* 移除元素
*
* @param e
* @return
*/
private Object unLinked(Node e) {
final Object element = e.elementData;
final Node next = e.next;
final Node prev = e.prev;
if (prev == null) {
first = next;
} else {
prev.next = next;
e.prev = null;
}
if (next == null) {
last = prev;
} else {
next.prev = prev;
e.next = null;
}
e.elementData = null;//把带移除元素置null
size--;
return element;
}
/**
* 返回链表中特定位置的元素
*
* @param index
* @return
*/
@Override
public Object get(int index) {
checkRange(index);
return node(index);
}
/**
* 返回链表中元素的数量
*
* @return
*/
@Override
public int size() {
return size;
}
/**
* 元素作为链表第一个元素
*
* @param o
*/
public void addFirst(Object o) {
linkedFirst(o);
}
/**
* 元素作为链表第一个元素
*
* @param o
*/
private void linkedFirst(Object o) {
final Node f = first;
final Node newNode = new Node(null, o, f);
first = newNode;
if (f == null) {//当链表为空时,把新元素设置为last
last = newNode;
} else {
f.prev = newNode;
}
size++;
}
/**
* 元素作为链表最后一个元素
*
* @param
*/
public void addLast(Object O) {
linkedLast(O);
}
public Object removeFirst() {
final Node f = first;
if (f == null) {
throw new NoSuchElementException();
}
final Object element = f.elementData;
final Node next = f.next;
f.elementData = null;
f.next = null;
first = next;
if (next == null) {
last = null;
} else {
next.prev = null;
}
size--;
return element;
}
public Object removeLast() {
final Node l = last;
if (l == null) {
throw new NoSuchElementException();
}
final Object element = l.elementData;
final Node prev = l.prev;
l.elementData = null;
l.prev = null;
last = prev;
if (prev == null){
first = null;
}else {
prev.next = null;
}
size--;
return element;
}
/**
* 把元素插入succ节点,
*
* @param o
* @param succ
*/
private void linkedBefore(Object o, Node succ) {
final Node pred = succ.prev;//找出succ的前一个Node;
final Node newNode = new Node(pred, o, succ);//建立一个新节点。
succ.prev = newNode;//把插入位置的原节点的前一个prev指向新节点
if (pred == null) {
first = newNode;//说明原节点时头节点
} else {
pred.next = newNode;
}
size++;//集合数量+1;
}
/**
* 把元素添加至链表最后;
*
* @param o
*/
private void linkedLast(Object o) {
final Node l = last;
final Node newNode = new Node(l, o, null);
last = newNode;
if (l == null) {//添加第一个元素时,l为空
first = newNode;
} else {
l.next = newNode;
}
size++;
}
/**
* 根据index返回节点信息
*
* @param index
* @return
*/
private Node node(int index) {
if (index < (size >> 1)) {//如果节点在集合的前半部分;
Node x = first;//把头指针给x;
//遍历前半部分节点
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;
}
}
/**
* 链表节点类
*/
private static class Node {
private Object elementData;
private Node prev;
private Node next;
public Node(Node prev, Object elementData, Node next) {
this.prev = prev;
this.next = next;
this.elementData = elementData;
}
}
public MyIterator iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements com.util_1.MyIterator {
@Override
public boolean hasNext() {
return false;
}
@Override
public Object next() {
return null;
}
}
}