package firstHomeWork.util;
import java.util.NoSuchElementException;
/**
* @Description: 双向链表
* @author: leijing
* @date: 2017年2月24日 上午11:37:58
* @param <E>
*/
public class DoubleLinkedList<E> {
private int size;//节点个数
private Node<E> head;//头节点
private Node<E> tail;//尾节点
public Node<E> getHead() {
return head;
}
public void setHead(Node<E> head) {
this.head = head;
}
public Node<E> getTail() {
return tail;
}
public void setTail(Node<E> tail) {
this.tail = tail;
}
/**
* @Description: 添加元素到头部
* @param e
* @return: boolean
* @author: leijing
* @date: 2017年2月24日 上午11:38:20
*/
public boolean addFirst(E e) {
Node<E> node = new Node<E>(e);
if(null == head){
node.prev = null;
head = node;
tail = head;
}else{
node.next = head;
head.prev = node;
head = node;
}
size++;
return true;
}
/**
* @Description: 添加元素到尾部
* @param e
* @return: boolean
* @author: leijing
* @date: 2017年2月24日 上午11:38:20
*/
public boolean addLast(E e) {
Node<E> node = new Node<E>(e);
if(null == tail){
tail.next = null;
tail = node;
head = tail;
}else{
tail.next = node;
node.prev = tail;
tail = node;
}
size++;
return true;
}
public boolean remove(E o) throws Exception {
if(isEmpty()){
throw new Exception("链表为空,没有元素可以删除");
}
Node<E> current = head;//从头节点开始删
if(o == null){
while(current != null){
if(current.data == null){
current.prev.next = current.next;//将当前节点的前驱节点的后继节点改为当前节点的后继
current.next.prev = current.prev;//将当前节点后继节点的前驱节点改为当前节点的前驱节点
current.next = null;//当前节点的前驱改为null
current.prev = null;//当前节点的后继改为null
size--;
return true;
}
current = current.next;
}
}else{
while(current != null){
if(o.equals(current.data)){
current.prev.next = current.next;//将当前节点的前驱节点的后继节点改为当前节点的后继
current.next.prev = current.prev;//将当前节点后继节点的前驱节点改为当前节点的前驱节点
current.next = null;//当前节点的前驱改为null
current.prev = null;//当前节点的后继改为null
size--;
return true;
}
current = current.next;
}
}
return false;
}
/**
* @Description: 返回元素个数
* @return: int
* @author: leijing
* @date: 2017年2月24日 上午11:38:20
*/
public int size() {
return size;
}
/**
* @Description: 是否空链表
* @return: boolean
* @author: leijing
* @date: 2017年2月24日 上午11:38:20
*/
public boolean isEmpty() {
return size == 0;
}
/**
* @Description: 检查下标有效性
* @param index
* @return: void
* @author: leijing
* @date: 2017年2月24日 上午11:40:15
*/
private void rangeCheck(int index){
if(index < 0 || index > size){
throw new IndexOutOfBoundsException();
}
}
public E get(int index) {
rangeCheck(index);
Node<E> current = head;//从头节点开始
int i = 0;
while(current != null){
if(i == index){
return current.data;
}
current = current.next;
i++;
}
return null;
}
public Node<E> node(int index) {
rangeCheck(index);
if(index < size >> 1){//小于元素大小的二分之一,从头节点开始遍历
Node<E> current = head;//从头节点开始
for(int i = 0 ; i < index ; i++){
current = current.next;
}
return (Node<E>)current;
}else{//从尾节点开始遍历
Node<E> current = tail;//从尾节点开始
for(int i = 0 ; i < index ; i++){
current = current.prev;
}
return (Node<E>)current;
}
}
/**
* @Description: 设置某个位置的元素
* @param index
* @param data
* @return: E
* @author: leijing
* @date: 2017年2月24日 上午11:58:32
*/
public E set(int index, E data) {
rangeCheck(index);
Node<E> current = head;//从头节点开始
int i = 0;
while(current != null){
if(i == index){
Node<E> node = new Node<E>(data);
Node<E> prev = current.prev;
prev.next = node;
node.prev = prev;
node.next = current;
current.prev = node;
size++;
return data;
}
current = current.next;
i++;
}
return null;
}
/**
* @Description: 判断是否包含某个元素
* @param o
* @throws Exception
* @return: boolean
* @author: leijing
* @date: 2017年2月24日 上午11:57:35
*/
public boolean contains(Object o) throws Exception {
if(isEmpty()){
throw new Exception("链表为空,没有任何元素");
}
Node<E> current = head;//从头节点开始找
if(o == null){
while(current != null){
if(current.data == null){
return true;
}
current = current.next;
}
}else{
while(current != null){
if(o.equals(current.data)){
return true;
}
current = current.next;
}
}
return false;
}
/**
* @Description: 清空链表,删除所有元素
* @return: void
* @author: leijing
* @date: 2017年2月24日 下午4:41:56
*/
public void clear() {
Node<E> current = head;//从头节点开始遍历
while(current != null){
Node<E> tmp = current;
current = current.next;
tmp.prev = null;
tmp.next = null;
}
size = 0;
}
public Iterator<E> iterator() {
return new ListItr(0);
}
private class ListItr implements Iterator<E>{
private Node<E> lastReturned = null;//当前的节点
private Node<E> next;//下一个节点
private int nextIndex;//当前索引的下标
public ListItr(int nextIndex){
next = (nextIndex == size) ? null : node(nextIndex);
}
@Override
public boolean hasNext() {
return nextIndex < size;
}
@Override
public E next() {
if (!hasNext()){
throw new NoSuchElementException();
}
lastReturned = next;
next = next.next;
nextIndex++;
return lastReturned.data;
}
@Override
public void remove() {
if (lastReturned == null){
throw new IllegalStateException();
}
if(lastReturned == next){//tail node
lastReturned.prev.next = null;
lastReturned.prev = null;
}else{
lastReturned.prev.next = lastReturned.next;
lastReturned.next.prev = lastReturned.prev;
lastReturned.next = null;
lastReturned.prev = null;
}
nextIndex--;
}
public boolean hasPrev(){
return nextIndex > 0;
}
public E prev(){
if(!hasPrev()){
throw new NoSuchElementException();
}
next = lastReturned = (next == null ) ? tail : next.prev;//如果是头节点,前一个指向尾节点
nextIndex--;
return lastReturned.data;
}
}
static class Node<E>{
private E data;
private Node<E> prev;//前驱节点
private Node<E> next;//后继节点
public Node(E data){
this.data = data;
}
public E getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
public Node<E> getPrev() {
return prev;
}
public void setPrev(Node<E> prev) {
this.prev = prev;
}
public Node<E> getNext() {
return next;
}
public void setNext(Node<E> next) {
this.next = next;
}
}
}