package com.zt.data;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class DoubleNodeLinkedList<Item> implements Iterable<Item>{
private DoubleNode first;
private DoubleNode last;
private int N;
public class DoubleNode<Item>{
public DoubleNodeLinkedList<Item> p = (DoubleNodeLinkedList<Item>) list();
Item item;
DoubleNode prev;
DoubleNode next;
public DoubleNode(Item item){
this.item = item;
}
public DoubleNode(){}
}
public int size(){
return N;
}
public DoubleNodeLinkedList<Item> list() {
// TODO Auto-generated method stub
return this;
}
public boolean isEmpty(){
return N==0;
}
public void insertFrist(Item item){
DoubleNode<Item> node = new DoubleNode<Item>();
node.item = item;
if(isEmpty()){
first = node;
last = node;
}else{
node.next = first;
first.prev = node;
first = node;
}
N++;
}
public void append(Item item){
DoubleNode<Item> node = new DoubleNode<>();
node.item = item;
if(isEmpty()){
last = node;
first = node;
}
last.next = node;
node.prev = last;
last = node;
N++;
}
/**
* 获取index为k的节点
* @param k
* @return
*/
public DoubleNode node(int k){
DoubleNode current = null;
int i=1;
if(k>0){
current = first;
while(i<k && current!=null){
current = current.next;
i++;
}
}else if(k<0){
k = -k;
current = last;
while(i<k && current!=null){
current = current.prev;
i++;
}
}
return current;
}
/**
* 删除头结点
* @return
*/
public Item deleteFirst(){
if(isEmpty()) {
throw new RuntimeException("List is Empty");
}
Item item = (Item) first.item;
first.p = null;
if(first.next!=null) first.next.prev=null;
first = first.next;
N--;
if(first==null) last=null;
return item;
}
/**
* 删除尾节点
* @return
*/
public Item deleteLast(){
if(isEmpty()){
throw new RuntimeException("List is Empty!");
}
Item item = (Item) last.item;
if(last==null){
first=null;
}
if(last.prev!=null){
last.prev.next=null;
}
last = last.prev;
N--;
return item;
}
/**
* 在指定节点之后插入节点
* @param node
* @param item
*/
public void insertAfter(DoubleNode node,Item item){
if(node == last){
append(item);
}else{
DoubleNode x = new DoubleNode();
x.item = item;
DoubleNode next = node.next;
x.prev = node;
x.next =next;
node.next = x;
next.prev = x;
}
N++;
}
/**
* 在指定节点之前插入节点
* @param node
* @param item
*/
public void insertBefore(DoubleNode node,Item item){
if(node==first){
insertFrist(item);
}else{
DoubleNode x = new DoubleNode();
x.item = item;
DoubleNode prev = node.prev;
x.next = node;
x.prev = prev;
prev.next = x;
node.prev = x;
}
N++;
}
public String toString(){
StringBuilder s = new StringBuilder();
for(Item item:this){
s.append(item+"|");
}
return s.toString();
}
/**
* 删除指定节点
* @param index
*/
public void delete(int index){
if(index<0 || index>N) throw new RuntimeException("This is no exists!");
if(node(index)==first){
deleteFirst();
}else if(node(index)==last){
deleteLast();
}else{
DoubleNode node = node(index);
DoubleNode prev = node.prev;
DoubleNode next = node.next;
prev.next = next;
next.prev = prev;
}
N--;
}
@Override
public Iterator<Item> iterator() {
return new ListIterator();
}
private class ListIterator<Item> implements Iterator<Item>{
private DoubleNode current = first;
@Override
public boolean hasNext() {
return current!=null;
}
public void remove(){
throw new UnsupportedOperationException();
}
@Override
public Item next() {
if(!hasNext()){
throw new NoSuchElementException("no such element");
}
Item item =(Item) current.item;
current = current.next;
return item;
}
}
public static void main(String[] args) {
DoubleNodeLinkedList<Integer> dn = new DoubleNodeLinkedList<Integer>();
for(int i=0;i<10;i++){
dn.append(i);
}
System.out.println(dn.toString());
dn.delete(-1);
System.out.println(dn.toString());
}
}
转载于:https://my.oschina.net/projerry/blog/666298