package com.github.lhpmatlab.coding2017.basic;
/**
* Created by andy on 2017/2/18.
*/
public class MyLinkedList<T> {
private class Node<T> {
public Node<T> pre;
public Node<T> next;
public T data;
public Node(Node<T> pre,Node<T> next,T data) {
this.pre = pre;
this.next = next;
this.data = data;
}
}
private int dataSize;
private Node head;
private Node tail;
public MyLinkedList() {
head = new Node<T>(null,null,null);
tail = new Node(head, null, null);
head.next = tail;
dataSize = 0;
}
public void add(T t) {
// add(size(), t);
Node<T> newNode = new Node<>(null, tail, t);
newNode.pre = tail.pre;
tail.pre.next = newNode;
tail.pre = newNode;
dataSize++;
}
/**
* 根据索引添加没有实现
* @param index
* @param element
*/
public void add(int index,T element) {
//TODO 根据索引添加元素
// addBefore(getNode(index,0,size()-1),element);
// if (index == dataSize) {
// add(element);
// } else {
//
// }
}
public T get(int index) {
return getNode(index).data;
}
public T set(int index, T newValue) {
Node<T> node = getNode(index);
T oldData = node.data;
node.data = newValue;
return oldData;
}
public T remove(int index) {
Node<T> node = getNode(index);
node.next.pre = node.pre;
node.pre.next = node.next;
dataSize--;
return node.data;
}
private void addBefore(Node<T> node, T element) {
// newNode.pre.next = newNode;
// node.pre = newNode;
Node<T> pre = node.pre;
Node<T> newNode = new Node<>(node.pre, node, element);
node.pre = newNode;
pre.next = newNode;
dataSize++;
}
private Node<T> getNode(int index) {
return getNode(index, 0, size());
}
private Node<T> getNode(int index, int lower, int upper) {
Node<T> p;
if (index < lower || index > upper) {
throw new IndexOutOfBoundsException();
}
if (index < size() / 2) {
p = head.next;
for (int i = 0; i < index; i++) {
p = p.next;
}
} else {
p = tail.pre;
for (int i = size()-1; i > index; i--) {
p = p.pre;
}
}
return p;
}
public int size() {
return dataSize;
}
public boolean isEmpty() {
return size() == 0;
}
}