自己实现的泛型的LinkedList

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35529801/article/details/79772925
public class MyLinkedList<T> {
	private Node first;
	private Node last;
	private int size;
	
	public boolean add(T obj) {
		Node newNode = new Node();
		
		if(size == 0) {
			newNode.previous = null;
			newNode.obj = obj;
			newNode.next = null;
			
			first = newNode;
			last = newNode;
		} else {
			newNode.previous = last;
			newNode.obj = obj;
			newNode.next = null;
			last.next = newNode;
			last = newNode;
		}
		size++;
		return true;
	}
	
	public boolean add(int index, T obj) {
		if(index < 0 || index > size) {
			throw new RuntimeException("索引不合法");
		} else if(index == 0 && size == 0) {
			add(obj);
		} else if(index == 0) {
			Node newNode = new Node();
			newNode.next = first;
			newNode.obj = obj;
			newNode.previous = null;
			first = newNode;
			size++;
		} else if(index == size){
			add(obj);
		} else {
			Node newNode = new Node();
			newNode.obj = obj;
			
			Node node = first;
			for(int i=0; i<index; i++) {
				node = node.next;
			}
			
			Node left = node.previous;
			
			left.next = newNode;
			newNode.previous = left;
			
			newNode.next = node;
			node.previous = newNode;
			size++;
		}
		return true;
	}
	
	public boolean remove(int index) {
		if(index < 0 || index >= size) {
			throw new RuntimeException("索引不合法");
		} else if(index == 0) {
			first = first.next;
			first.previous = null;
		} else if(index == (size - 1)) {
			last = last.previous;
			last.next = null;
		} else {
			Node node  = first;
			
			for(int i=0; i<index; i++) {
				node = node.next;
			}
			
			Node left = node.previous;
			Node right = node.next;
			
			left.next = right;
			right.previous = left; 
		}
		size--;
		return true;
	}
	
	public boolean remove(T obj) {
		int index = indexOf(obj);
		
		if(index == -1) {
			return false;
		} else {
			remove(index);
		}
		return true;
	}
	
	public T get(int index) {
		if(index < 0 || index >= size) {
			throw new RuntimeException("越界");
		} 
		Node node = first;
		for(int i=0; i<index; i++) {
			node = node.next;
		}
		return (T) node.obj;
	}
	
	public int indexOf(T obj) {
		int index = -1;
		Node node = first;
		
		for(int i=0; i<size; i++) {
			if(node.obj.equals(obj)) {
				index = i;
				break;
			} else {
				node = node.next;
			}
		}
		
		return index;
	}
	
	public int size() {
		return size;
	}

	public void clear() {
		first = null;
		last = null;
	}
	
	public boolean contains(T obj) {
		if(size == 0) {
			return false;
		}
		int index = -1;
		Node node = first;
		
		for(int i=0; i<size; i++) {
			if(node.obj.equals(obj)) {
				index = i;
				break;
			}
		}
		
		if(index == -1) {
			return false;
		} else {
			return true;
		}
	}
	private class Node {
		public Node previous;
		public Object obj;
		public Node next;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_35529801/article/details/79772925
今日推荐