zoukankan      html  css  js  c++  java
  • 【Java】双向链表的实现

    双向链表,每个节点有一个属性值,一个指向前一个节点prev,一个指向后一个节点next,



    Link接口:

    public interface Link {
    	boolean add(Object obj);	//添加
    	boolean remove(Object obj); //删除
    	int length();				//求长度
    	Object[] toArray();			//转换为数组
    	boolean contains(Object obj);//包含
    	int indexOf(Object obj);	//查找第几个
    	boolean set(int index,Object newElement);//修改
    	Object get(int index);		//返回index的节点
    	void clear();				//清空
    	void print();
    }
    

    实现Link接口的LinkImpl类:

    public class LinkImpl implements Link {
    	private Node first;
    	private Node last;
    	private int size=0;
    	
    	private class Node{
    		Object item;
    		private Node prev;
    		private Node next;
    		private Node(Object item, Node prev, Node next) {
    			this.item = item;
    			this.prev = prev;
    			this.next = next;
    		}
    	}
    	@Override
    	public boolean add(Object obj) {
    		if(this.first==null) {
    			this.first = new Node(obj,null,null);
    			this.last = this.first;
    			this.size++;
    			return true;
    		}
    		Node newNode = new Node(obj,this.last,null);
    		this.last.next = newNode;
    		this.last = newNode;
    		this.size++;
    		return true;
    	}
    
    	@Override
    	public int length() {
    		return this.size;
    	}
    
    	@Override
    	public Object[] toArray() {
    		if(this.size==0) {
    			return null;
    		}
    		Object[] objects =new Object[this.size];
    		Node cur = this.first;
    		for(int i=0;i<this.size;i++) {
    			objects[i]=cur.item;
    			cur=cur.next;
    		}
    		return objects;
    	}
    
    	@Override
    	public boolean contains(Object obj) {
    		return indexOf(obj)!=-1;
    	}
    
    	@Override
    	public int indexOf(Object obj) {
    		int index = 0;
    		Node cur = this.first;
    		if(obj==null) {
    			while(cur!=null) {
    				if(cur.item==null) {
    					return index;
    				}
    				cur=cur.next;
    				index++;
    			}
    		}else {
    			while(cur!=null) {
    				if(obj.equals(cur.item)) {
    					return index;
    				}
    				cur=cur.next;
    				index++;
    			}
    		}
    		return -1;
    	}
    
    	private Node node(int index) {
    		Node cur = this.first;
    		if(index<(this.size>>1)) {
    			for(int i=0;i<index;i++) {
    				cur=cur.next;
    			}
    		}else {
    			cur = this.last;
    			for(int i=this.size-1;i>index;i--) {
    				cur = cur.prev;
    			}
    		}
    		return cur;
    	}
    	
    	@Override
    	public boolean set(int index, Object newElement) {
    		if(index>=this.size||index<0) {
    			return false;
    		}
    		Node cur = node(index);
    		cur.item=newElement;
    		return true;
    	}
    
    	@Override
    	public Object get(int index) {
    		if(index>=this.size||index<0) {
    			return null;
    		}
    		Node cur = node(index);
    		return cur.item;
    	}
    
    	@Override
    	public void clear() {
    		Node cur = this.first;
    		while(cur!=null) {
    			Node next = cur.next;
    			cur.item=null;
    			cur.prev=null;
    			cur.next=null;
    			cur=next;
    		}
    		this.first=null;
    		this.last=null;
    		this.size=0;
    	}
    
    	@Override
    	public boolean remove(Object obj) {
    		int index = indexOf(obj);
    		if(index==-1) {
    			return false;
    		}
    		Node div = this.first;
    		for(int i=0;i<index;i++) {
    			div = div.next;
    		}
    		if(div==this.first) {			
    			if(div==this.last) {
    				this.first=this.last=null;
    			}else {
    				Node tmp = this.first;
    				this.first = tmp.next;
    				this.first.prev = null;
    				tmp.next = null;
    				tmp = null;
    			}
    		}
    		else if(div==this.last) {
    			Node tmp = this.last;
    			this.last = tmp.prev;
    			this.last.next = null;
    			tmp.prev = null;
    			tmp = null;
    		}else {
    			div.prev.next=div.next;
    			div.next.prev=div.prev;
    			div.prev=null;
    			div.next=null;	
    		}				
    		this.size--;
    		return true;		
    	}
    
    	@Override
    	public void print() {
    		Node cur = this.first;
    		while(cur!=null) {
    			System.out.print(cur.item+" ");
    			cur=cur.next;
    		}
    		System.out.println();
    	}
    }

    产生Link的工厂类:

    public class Factory {
    	private Factory() {
    	}
    	public static Link getLinkList() {
    		return new LinkImpl();
    	}
    }
    

    Test主类:

    public class Test {
    	public static void main(String[] args) {
    		Link list = Factory.getLinkList();
    		list.add("一");
    		list.add("二");
    		list.add("三");
    		list.add("四");
    		list.add("五");
    		list.print();
    		System.out.println(list.get(-1));
    		System.out.println(list.get(0));
    		System.out.println(list.get(1));
    		System.out.println(list.get(5));
    		int index=list.indexOf("四");
    		System.out.println("四在第几个位置:"+index);
    		System.out.println("length:"+list.length());
    		System.out.println(list.remove(list.get(7)));
    		System.out.println(list.remove(list.get(2)));
    		System.out.println(list.remove(list.get(0)));
    		list.print();
    		Object[] objects = list.toArray();
    		for(int i=0;i<objects.length;i++) {
    			System.out.print(objects[i]+" ");
    		}
    		System.out.println();
    		System.out.println("##########");
    		list.clear();
    		System.out.println(list.get(0));
    		list.print();
    	}
    }

    测试结果:



  • 相关阅读:
    用DecimalFormat格式化十进制数字的实际应用
    ETL测试小结
    浅谈DB2的四个隔离级别
    POI处理Excel中各种日期格式问题
    如何将Object类型转换成String类型
    ArrayList和LinkedList
    DB2 编目并访问远程数据库
    EXCEL解析之终极方法WorkbookFactory
    DB2中coalesce函数的应用
    【Linux学习】Linux用户管理2—用户配置文件
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615351.html
Copyright © 2011-2022 走看看