纯手写LinkedList集合

java代码

package com.xhz.linkedlist;

/**
 * 纯手写LinkedList
 * 
 * @author xhz
 *
 * @param <E>
 */
public class ExtLinkedList<E> {
	// 链表实际存储元素
	private int size;

	// 第一个元素(头节点,为了查询开始)
	private Node first;

	// 最后一个元素(头节点,为了添加开始)
	private Node last;

	// 添加元素
	public void add(E e) {
		// 创建节点
		Node node = new Node();
		// 给节点赋值
		node.object = e;
		if (first == null) {
			// 添加第一个元素
			// 给第一个元素赋值node节点赋值
			first = node;
			// 第一个元素头和尾都属于自己
		} else {
			// 添加第二个或以上数据
			node.prev = last;
			// 将上一个元素的next赋值
			last.next = node;
		}
		last = node;
		// 实际长度++
		size++;
	}

	// 按照指定索引插入元素
	public void add(int index, E e) {
		// 下标的验证
		checkElementIndex(index);
		// node2节点
		ExtLinkedList<E>.Node oldNode = getNode(index);
		if (oldNode != null) {
			// node1
			ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
			// 新增node节点
			// node4
			Node newNode = new Node();
			newNode.object = e;

			// node4下一个节点为node2
			newNode.next = oldNode;
			if (oldPrevNode == null) {
				first = newNode;
			} else {
				// node4上一个节点为node1
				newNode.prev = oldPrevNode;
				// node1下一个节点为node4
				oldPrevNode.next = newNode;
			}
			// node2的上一个节点为node4
			oldNode.prev = newNode;
			size++;
		}
	}

	// 链表节点存储元素
	private class Node {
		// 存放元素的值
		Object object;
		// 上一个节点Node
		Node prev;
		// 下一个节点Node
		Node next;
	}

	// 按照下标查询
	public Object get(int index) {
		// 下标的验证
		checkElementIndex(index);
		return getNode(index).object;
	}

	// 按照下标获得节点
	public Node getNode(int index) {
		// 下标的验证
		checkElementIndex(index);
		Node node = null;
		if (first != null) {
			node = first;// 默认取第0个
			for (int i = 0; i < index; i++) {
				node = node.next;
			}
		}
		return node;
	}

	// 按照指定下标删除
	public void remove(int index) {
		checkElementIndex(index);
		// 1.先获取当前删除node节点
		ExtLinkedList<E>.Node oldNode = getNode(index);
		if (oldNode != null) {
			// 2.获取删除元素的上下节点
			// node3
			ExtLinkedList<E>.Node oldNextNode = oldNode.next;
			// node1
			ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
			// 将node1的下一个节点变为node3
			if (oldPrevNode == null) {
				// 删除第一个元素从新换头
				first = oldNextNode;
			} else {
				oldPrevNode.next = oldNextNode;
				oldNode.prev = null;
			}
			// 将node3的上一个节点变为node1
			if (oldNextNode == null) {
				last = oldPrevNode;
			} else {
				oldNextNode.prev = oldPrevNode;
				oldNode.next = null;
			}
			oldNode.object = null;
			// 让垃圾回收机制回收
			size--;
		}
	}

	// 检查下标是否越界
	public void checkElementIndex(int index) {
		if (!isElementIndex(index)) {
			throw new IndexOutOfBoundsException("查询越界啦!");
		}
	}

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

	// 大小
	public int size() {
		return size;
	}

	public static void main(String[] args) {
		ExtLinkedList<String> extLinkedList = new ExtLinkedList<String>();
		extLinkedList.add("a");
		extLinkedList.add("b");
		extLinkedList.add("c");
		extLinkedList.add("d");
		System.out.println("########################################");
		System.out.println(extLinkedList.first.object);
		System.out.println(extLinkedList.first.next.object);
		System.out.println(extLinkedList.first.next.next.object);
		System.out.println(extLinkedList.first.next.next.next.object);
		System.out.println("########################################");
		// 其实从头查到尾,效率不高,查询算法:折半查找(二分法)
		for (int i = 0; i < extLinkedList.size; i++) {
			System.out.println(extLinkedList.get(i));
		}
		System.out.println("长度:" + extLinkedList.size());
		System.out.println("########################################");
		extLinkedList.add(3, "小盒子");
		for (int i = 0; i < extLinkedList.size; i++) {
			System.out.println(extLinkedList.get(i));
		}
		System.out.println("########################################");
		System.out.println("删除之前:" + extLinkedList.get(2));
		extLinkedList.remove(2);
		System.out.println("删除之后:" + extLinkedList.get(2));
		System.out.println("########################################");
	}

}

控制台打印结果:

########################################
a
b
c
d
########################################
a
b
c
d
长度:4
########################################
a
b
c
小盒子
d
########################################
删除之前:c
删除之后:小盒子
########################################

猜你喜欢

转载自blog.csdn.net/qq_35393693/article/details/80512734