源码分析之手写ExtLinkedList

public class ExtLinkedList<E> {

	// 链表实际存储元素
	private int size;
	// 第一个元素(头节点,为了查询)
	private Node first;
	// 最后一个元素(尾节点,为了添加)
	private Node last;

	// add
	public void add(E e) {
		Node node = new Node();//
		node.object = e;
		if (first == null) {
			// 添加第一个元素
			// 给第一个元素赋值给node节点
			first = node;

			// 以一个元素的首尾都是其本身
		} else {
			// 添加第二个或以上数据
			node.prev = last;
			last.next = node;// 上一个元素的next赋值
		}
		last = node;
		size++;
	}

	// 下标添加
	public void add(int index, E e) {
		// 下标的验证
		checkElementIndex(index);
		/*if (index == size) {//
			add(e);
		}*/
		Node oldNode = getNode(index);// 原本下标index的节点 node2
		if (oldNode != null) {
			//Node oldNextNode = oldNode.next;// nodel3
			Node oldPrevNode = oldNode.prev;// node1
			Node newNode = new Node();// node4
			newNode.object = e;
			// node4的下一个节点
			newNode.next = oldNode;
			if (oldPrevNode == null) {
				first = newNode;
			} else {
				// node4的上一个节点
				newNode.prev = oldPrevNode;
				// node1的下个节点
				oldPrevNode.next = newNode;
			}

			// node2的下个节点
			oldNode.prev = newNode;
		}
		size++;
	}

	// get
	public Object get(int index) throws Exception {
		if (!isElementIndex(index))
			throw new IndexOutOfBoundsException("越界了");
		Node node = null;
		if (first != null) {
			node = first;
			for (int i = 0; i < index; i++) {
				node = node.next;
			}
		}

		return node.object;
	}

	public void remove(int index) throws Exception {
		if (!isElementIndex(index))
			throw new IndexOutOfBoundsException("越界了");
		ExtLinkedList.Node oldNode = getNode(index);
		if (oldNode != null) {
			// 获取删除节点的上下节点
			// node3
			ExtLinkedList.Node nextNode = oldNode.next;
			// node1
			ExtLinkedList.Node prevNode = oldNode.prev;
			if (prevNode != null) {
				prevNode.next = nextNode;
				oldNode.prev = null;
			} else {
				first = nextNode;
			}
			if (nextNode != null) {
				nextNode.prev = prevNode;
				oldNode.next = null;
			} else {
				last = prevNode;
			}
			nextNode.object = null;
			size--;
		}
		/*
		 * oldNode.prev.next = oldNode.next; oldNode.next.prev = oldNode.prev;
		 */
	}

	// 获取node
	public Node getNode(int index) {
		if (!isElementIndex(index))
			throw new IndexOutOfBoundsException("越界了");
		Node node = null;
		if (first != null) {
			node = first;
			for (int i = 0; i < index; i++) {
				node = node.next;
			}
		}
		return node;
	}

	public int getSize() {
		return size;
	}

	// 链表节点存储元素
	private static class Node {
		Object object;// 当前元素
		Node prev;// 上一个元素
		Node next;// 写一个元素
	}

	private void checkElementIndex(int index) {
		if (!isElementIndex(index))
			throw new IndexOutOfBoundsException("越界");
	}

	private boolean isElementIndex(int index) {
		return index >= 0 && index < size;
	}

	private String outOfBoundsMsg(int index) {
		return "Index: " + index + ", Size: " + size;
	}

	public static void main(String[] args) throws Exception {
		ExtLinkedList extLinkedList = new ExtLinkedList();
		extLinkedList.add("a");
		extLinkedList.add("b");
		extLinkedList.add("c");
		extLinkedList.add("e");
	
		System.out.println("前"+extLinkedList.size);
		System.out.println(extLinkedList.get(3));
		extLinkedList.add(3, "d");
		System.out.println("后"+extLinkedList.size);
		System.out.println(extLinkedList.get(3));
		/*for (int i = 0; i < extLinkedList.size-1; i++) {
			Object object = extLinkedList.get(i);
			System.out.println(object);
		}*/
		/*
		 * for (int i = 0; i < extLinkedList.size; i++) {
		 * System.out.println("--" + extLinkedList.get(i)); }
		 */

	}
}

猜你喜欢

转载自blog.csdn.net/qq_41988225/article/details/84631702