(Java)Java双向链表实现(数据结构七)

1.迭代器接口实现

package com.zhaochao;

public interface Iterator<E> {
	 boolean  hasNext();
	 E        next();
	 boolean  delete();
	 boolean  modify(E e);
	 int      index();
}

2.异常类实现

package com.zhaochao;

public class IndexOutOfBoundsException extends RuntimeException {
	 private static final long serialVersionUID = 234122996006267687L;

	    /**
	     * Constructs an <code>IndexOutOfBoundsException</code> with no
	     * detail message.
	     */
	    public IndexOutOfBoundsException() {
	        super();
	    }

	    /**
	     * Constructs an <code>IndexOutOfBoundsException</code> with the
	     * specified detail message.
	     *
	     * @param   s   the detail message.
	     */
	    public IndexOutOfBoundsException(String s) {
	        super(s);
	    }
}


3.双向链表实现

package com.zhaochao;

import java.util.LinkedList;

public class DLinkList<E> {
	
	transient int length;
	Node<E> head;
	Node<E> tail;
	
	public DLinkList(){
		
	}
	public Iterator<E> iterator(){
		return new DLinkIterator();
	}
	public int size(){
		return length;
	}
	private class DLinkIterator implements Iterator  {
		
		transient int nowIndex=0;
		public DLinkIterator(){
			
		}
		@Override
		public boolean hasNext() {
			// TODO Auto-generated method stub
			return nowIndex<length;
		}

		@Override
		public E next() {
			// TODO Auto-generated method stub
			Node<E> node=getNode(nowIndex);
			nowIndex++;
			return node.date;
		}

		@Override
		public boolean delete() {
			// TODO Auto-generated method stub
			deleteIndex(nowIndex);
			return false;
		}

		@Override
		public boolean modify(Object e) {
			// TODO Auto-generated method stub
			Node<E> node=getNode(nowIndex);
			node.date=(E) e;
			return true;
		}

		@Override
		public int index() {
			// TODO Auto-generated method stub
			return nowIndex;
		}
		
		
	}
	public void add(E e){
		addLast(e);
	}
	
	public void add(int index, E e){
		checkIndex(index);
		if(index==0){
			addFrist(e);
		}else if(index==length-1){
			addLast(e);
		}else{
			Node<E> tempPre=getNode(index-1);
			Node<E> tempNext=getNode(index);
			Node<E> node=new Node(tempPre,e,tempNext);
			tempPre.next=node;
			tempNext.pre=node;
			length++;
		}
		
	}
	
	
	public void deleteIndex(int index){
		checkIndex(index);
		if(index==0){
			deleteFirst();
		}else if(index==length-1){
			deleteLast();
		}else{
			Node<E> tempPre=getNode(index-1);
			Node<E> tempNext=getNode(index+1);
			tempPre.next=tempNext;
			tempNext.pre=tempPre;
			length--;
		}
	}
	private boolean deleteFirst(){
		head=head.next;
		length--;
		return true;
	}
	private boolean deleteLast(){
		tail=tail.pre;
		length--;
		return true;
	}
	
	
	private Node<E> getNode(int index){
		checkIndex(index);
		Node<E> node;
		if(index<length>>1){
			node=head;
			for(int i=0;i<index;i++)
				node=node.next;
		}else{
			node=tail;
			for(int i=length-1;i>index;i--)
				node=node.pre;
		}
		return node;
	}
	
	private void checkIndex(int index){
		if(index<0 ||index>=length)
			throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
	}
	
	private String outOfBoundsMsg(int index){
		return "index:"+index+" length:"+size();
	}
	private boolean addFrist(E e){
		Node<E> h=head;
		Node<E> node=new Node(null,e,h);
		head=node;
		if(h==null){
			tail=node;
		}else{
			h.pre=node;
		}
		length++;
		return true;
	}
	
	private boolean addLast(E e){
		Node<E> l=tail;
		Node<E> node=new Node(l,e,null);
		tail=node;
		if(l==null){
			head=node;
		}else{
			l.next=node;
		}
		length++;
		return true;
	}
	
	private static class Node<E>{
		E date;
		Node<E> pre;
		Node<E> next;
		Node(E e){
			this.date=e;
		}
		Node(Node<E> pre,E e,Node<E> next){
			this.pre=pre;
			this.date=e;
			this.next=next;
		}
	}
	
	
}

4.测试

package com.zhaochao;


public class main {


	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		
		DLinkList<Test> dl=new DLinkList<Test>();
		Test t=new Test();
		for(int i=0;i<10;i++)
			dl.add(t);
		
		Iterator it=dl.iterator();
		while(it.hasNext())
			System.out.println(it.next());
	}

}


class Test{
	public static int a=0;
	public String toString(){
		return String.valueOf(a++);
	}
}

5.测试结果 

0
1
2
3
4
5
6
7
8
9


转载于:https://www.cnblogs.com/whzhaochao/p/5023511.html

/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列中元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列中元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值