Java:链表的基本操作

1、定义接口Link:

public interface Link {
	void add(Object obj);                //增加节点
	boolean remove(int index);           //删除指定节点
	boolean set(int index,Object obj);   //修改节点
	Object get(int index);               //查询指定节点
	void printLink();                    //打印链表
	Object[] toArray();                  //将链表节点内容存入数组
	int getSize();                       //得到链表大小
	void clear();                        //清空链表
	int contains(Object obj);            //判断obj是否存在于链表
}
2、定义LinkImpl类实现Link接口
public class LinkImpl implements Link {
	
	private Node first;
	private Node last;
	private int size;
	
//--------------------------
	private class Node{
		private Node prev;
		private Object data;
		private Node next;
		
		public Node(Node prev,Object data,Node next){
			this.prev = prev;
			this.data = data;
			this.next = next;
		}
	}
//--------------------------

	@Override
	public void add(Object obj) {
		Node lastNode = last;
		Node newNode = new Node(lastNode, obj, null);
		last = newNode;
		
		if(first == null) {
			first = newNode;
		}else {
			lastNode.next = newNode;
		}
		size++;
	}

	@Override
	public boolean remove(int index) {
		// TODO Auto-generated method stub
		if(index < 0 || index >= size) {
			return false;
		}
		else if(index == 0) {
			if(size == 1) {
				Node node = first;
				node = null;
				first = null;
				last = null;
				size--;
			}
			else {
				Node node = node(index);
				first = node.next;
				node.next.prev = null;
				node = null;
				size--;
			}
		}else if(index == size - 1) {
			Node node = node(index);
			last = node.prev;
			node.prev.next = null;
			node = null;
			size--;
		}else {
			Node node = node(index);
			node.prev.next = node.next;
			node.next.prev = node.prev;
			node = null;
			size--;
		}
		return true;
	}

	@Override
	public boolean set(int index, Object obj) {
		if(index < 0 || index >= size) {
			return false;
		}
		
		Node node = node(index);
		node.data = obj;
		
		return true;
	}
	
	private Node node(int index) {
		if(index < (size >> 1)) {
			Node temp = first;
			for(int i = 0;i < index;i++) {
				temp = temp.next;
			}
			return temp;
		}else {
			Node temp = last;
			for(int i = size - 1;i > index;i--) {
				temp = temp.prev;
			}
			return temp;
		}
	}

	@Override
	public Object get(int index) {
		// TODO Auto-generated method stub
		if(index < 0 || index >= size) {
			return null;
		}
		Object[] arr = toArray();
		return arr[index - 1];
	}

	@Override
	public void printLink() {
		Object[] arr = toArray();
		for(int i = 0;i < size;i++) {
			System.out.println(arr[i]);
		}
	}

	@Override
	public Object[] toArray() {
		Object[] arr = new Object[size];
		int i = 0;
		for(Node node = first;node != null;node = node.next) {
			arr[i++] = node.data;
		}
		return arr;
	}

	@Override
	public int getSize() {
		return size;
	}

	@Override
	public void clear() {
		Node rubbish;
		for(Node node = first;node != null;node = rubbish) {
			node.prev = null;
			node.data = 0;
			rubbish = node.next;
			node.next = null;
		}
		first = null;
		last = null;
		size = 0;
	}

	@Override
	public int contains(Object obj) {
		int index = 0;
		for(Node node = first;node != null;node = node.next) {
			if(node.data == obj) {
				return index + 1;
			}
			index++;
		}
		return -1;
	}

}
3、定义Factory类得到LinkImpl类的一个对象
public class Factory {
	private Factory() {
		
	};
	public static Link getLinkInstance() {
		return new LinkImpl();
	}
}
4、用户端测试类
public class Test {

	public static void main(String[] args) {
		Link link = Factory.getLinkInstance();
		link.add("火车头");
		link.add("车厢1");
		link.add("车厢2");
		link.add("车厢3");
		link.add("车尾");
		
		link.printLink();
		link.set(2, "VIP车厢");
		System.out.println("*******************");
		link.printLink();
		System.out.println("*******************");
		System.out.println(link.get(3));
		System.out.println("*******************");
		System.out.println(link.contains("车厢3"));
		System.out.println(link.contains("车厢三"));
		System.out.println("*******************");
		System.out.println(link.getSize());
		System.out.println("*******************");
		link.clear();
		link.printLink();
		System.out.println("*******************");
		System.out.println(link.getSize());
		link.remove(4);
		link.printLink();
	}

}

测试结果:

火车头
车厢1
车厢2
车厢3
车尾
*******************
火车头
车厢1
VIP车厢
车厢3
车尾
*******************
VIP车厢
*******************
4
-1
*******************
5
*******************
*******************
0

完!

猜你喜欢

转载自blog.csdn.net/weixin_41890097/article/details/81023586