linkedlist源码分析

一.继承体系
在这里插入图片描述
二.源码分析

  1. 添加链表元素

//获取指定索引元素

Node<E> node(int index){
	//二分查找
	if(index < (size >> 1)){
		//如果索引值在链表size/2之内
		

Node<E> prevNode = first;
		for(int i=0;i<index;i++){
				prevNode=prevNode.next;
			}
			return prevNode;
		}
		//否则从尾开始遍历
		else{
			Node<E> lastNode = last;
			for(int j=size-1;j>index;j--){
				lastNode=

lastNode.prev;
    			}
    			return lastNode;
		}
    		

    	}

插入元素频繁使用node方法根据索引找到要插入元素的位置,同时get方法获取元素也是用到此方法。

  • 从链表头部–size/2采用正向遍历
  • 如果没有找到对应元素,再从链表尾部反向遍历
  • 这样每次只最多遍历一次链表就可以知道索引对应元素

删除链表元素

private void unlink(Node<E> x) {
		// TODO Auto-generated method stub
		final E item =  x.e;//删除元素
		final Node<E> next = x.next;//删除元素后一个节点
		final Node<E> prev = x.prev;//删除元素前一个节点
		//前驱节点为空,表头指向后继元素
		if(prev == null){
			first = x.next;
		}else{
			//前驱元素的后继指向后继元素
			prev.next = next;
			//要删除元素的后继置为null
			x.prev = null;
		}
		
	//后继元素为空,表尾指针指向前驱元素
	if(next == null){
		last = x.prev;
	}else{
		//后继元素的前驱指向前驱元素
		next.prev = prev;
		//要删除元素的后继指针置为null
		x.next = null;
	}
	//要删除元素置为null
	x.e = null;
	//集合大小减一
	size --;
	//操作计数器加一
	modCount++;
}

–三.实现栈操作

class myQue{
	LinkedList<E> linkedList = null;
	LinkedList myQue(){
		linkedList = new LinkedList<>();
		return linkedList;
	}
	
	//加入元素
	void addEle(E o){
		linkedList.push(o);
	}
	
	//弹出元素
	E removeEle(){
		return linkedList.poll();
	}
	 //检索栈顶数据,但是不删除
    public E peek() {
        return linkedList.peek();
    }
}

–四arraylist和linkedlist比较

  1. arraylist底层基于数组实现,linkedlist底层基于链表实现。
  2. arraylist删除和添加元素都需要将剩下的数组元素重新复制一次,linkedlist只需要移动指定元素前后指针即可实现。
  3. arraylist支持随机访问,而linkedlist要移动指针指针。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值