纯手写ExtLinkedList

package com.xuyuedu;

@SuppressWarnings("all")

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;
			// 将上一个元素的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) {
			// oldPrevNode:Node1
			ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
			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;
	}

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

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

	public void remove(int index) {
		checkElementIndex(index);
		// 1.获取当前删除节点:Node2
		ExtLinkedList<E>.Node oldNode = getNode(index);
		if (oldNode != null) {
			// 2.获取删除元素上下节点
			// oldNextNode:Node3
			ExtLinkedList<E>.Node oldNextNode = oldNode.next;
			// oldPrevNode:Node1
			ExtLinkedList<E>.Node oldPrevNode = oldNode.prev;
			if (oldPrevNode == null) {
				// 删除第一个元素,要把下一个元素变为first
				first = oldNextNode;
			} else {
				// 将Node1的下一个节点变为Node3
				oldPrevNode.next = oldNextNode;
				oldNode.prev=null;
			}
			if (oldNextNode == null) {
				last=oldPrevNode;
			}else {
				// 将Node3的上一个节点变为Node1
				oldNextNode.prev = oldPrevNode;
				oldNode.next=null;
			}
			oldNode.object=null;//让垃圾回收掉
			size--;
		}
	}

	public static void main(String[] args) {
		ExtLinkedList<String> extLinkedList = new ExtLinkedList<String>();
		extLinkedList.add("q");
		extLinkedList.add("d");
		extLinkedList.add("r");
		extLinkedList.add("f");
		extLinkedList.add(0, "p");
		for(int i=0;i<extLinkedList.size;i++) {
			System.out.println(extLinkedList.get(i));
		}
	}
}

测试结果:

p
q
d
r
f
 

借鉴:分布式微服务专家:余胜军:qq:644064779

猜你喜欢

转载自blog.csdn.net/qq_38357267/article/details/81588807