算法(第四版)课后习题 1.3.31

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());
	}
	
	
	
	
	
}


你可能感兴趣的:(算法(第四版)课后习题 1.3.31)