超详细的纯手写的LinkedList源码

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){
			//添加第一个节点
			first=node;
			last=node;
		}else{
			//添加第二个及大于第二个节点
			node.prev=last;
			last.next=node;//第一个节点的下一个指针指向node节点
		}
		last=node;//为最后一个节点赋值
		size++;
	}
	public int size(){
		return size;
	}
	private void checkElement(int index){
		if(!isElementIndex(index))
			throw new IndexOutOfBoundsException("查询出错啦");
	}
	private boolean isElementIndex(int index){
		return index>=0&&index<size;
	}
	public Object get(int index){
		checkElement(index);
		ExtLinkedList<E>.Node node=getNode(index);
		return node.object;
	}
	public ExtLinkedList<E>.Node getNode(int index){
		checkElement(index);
		Node node=null;
		if(first!=null){
			node=first;//默认查找第一个节点
			for(int i=0;i<index;i++){
				node=node.next;
			}
		}
		return node;
	}
	public void remove(int index){
		checkElement(index);
		ExtLinkedList<E>.Node oldNode=getNode(index);
		if(oldNode!=null){
			//获取当前节点的上下节点
			ExtLinkedList<E>.Node oldNodePrev=oldNode.prev;
			ExtLinkedList<E>.Node oldNodeNext=oldNode.next;
			if(oldNodePrev==null){
				//删除第一个元素
				first=oldNodeNext;
			}else{
				oldNodePrev.next=oldNodeNext;
				oldNode.prev=null;
			}
			if(oldNodeNext==null){
				//删除最后一个元素
				last=oldNodePrev;
			}else{
				oldNodeNext.prev=oldNodePrev;
				oldNode.next=null;
			}
			size--;
		}
	}
	public void add(int index,E e){
		checkElement(index);
		ExtLinkedList<E>.Node oldNode=getNode(index);
		if(oldNode!=null){
			//获取当前节点的上下节点
			ExtLinkedList<E>.Node oldNodePrev=oldNode.prev;//node1
			ExtLinkedList<E>.Node oldNodeNext=oldNode.next;//node3
			Node newNode=new Node();
			newNode.object=e;
			//newNode.prev=oldNodePrev;
			newNode.next=oldNode;
			if(oldNodePrev==null){
				first=newNode;
			}else{
				newNode.prev=oldNodePrev;
				oldNodePrev.next=newNode;
			}
			oldNode.prev=newNode;
			size++;
		}
	}
	private class Node{
		public E object;
		Node prev;//前一个节点
		Node next;//后一个节点
	}
	public static void main(String[] args){
		ExtLinkedList extLinkedList=new ExtLinkedList();
		extLinkedList.add("1");
		extLinkedList.add("2");
		extLinkedList.add("3");	
		extLinkedList.add(2,"f");
		/*System.out.println(extLinkedList.first.object);
		System.out.println(extLinkedList.first.next.object);
		System.out.println(extLinkedList.first.next.next.object);*/
		for(int i=0;i<extLinkedList.size;i++){
			System.out.print(extLinkedList.get(i));
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值