• Java-双链表(泛型)


    使用泛型实现之前用Object的双链表:点击打开链接


    interface Link<T>

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


    public class LinkImpl<T> implements Link<T> {
    	private Node first;
    	private Node last;
    	private int size=0;
    	
    	private class Node{
    		T item;
    		private Node prev;
    		private Node next;
    		private Node(T obj, Node prev, Node next) {
    			this.item = obj;
    			this.prev = prev;
    			this.next = next;
    		}
    	}
    
    	@Override
    	public boolean add(T 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, T newElement) {
    		if(index>this.size||index<0) {
    			return false;
    		}
    		Node cur = node(index);
    		cur.item=newElement;
    		return true;
    	}
    
    	@Override
    	public T 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();
    	}
    }

    class Factory

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

    class Test

    public class Test {
    	public static void main(String[] args) {
    		Link<Integer> list = Factory.getLinkList();
    		list.add(1);
    		list.add(2);
    		list.add(3);
    		list.add(4);
    		list.add(5);
    		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(4);
    		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();
    	}
    }




  • 相关阅读:
    vue的nuxt框架中使用vue-video-player
    多线程学习笔记-1
    Java模拟简单的KFC程序
    Hankson最大公约数最小公倍数的“逆问题”
    C语言实现三天打鱼两天晒网
    关于border-color的一些小问题
    CSS的超链接样式设计
    CSS ID选择器&通配选择器
    CSS标签选择器&类选择器
    CSS布局属性
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615348.html
Copyright © 2020-2023  润新知