1 结构:List-》AbstractList-》ArrayList,LinkedList

package 链表;
public interface List<E> {//默认公共static final int ELEMENT_NOT_FOUND = -1;/*** 清除所有元素*/void clear();/*** 元素的数量*/int size();/*** 是否为空*/boolean isEmpty();/*** 是否包含某个元素*/boolean contains(E element);/*** 添加元素到尾部* @param element*/void add(E element);/*** 获取index位置的元素*/E get(int index);/*** 设置index位置的元素*/E set(int index, E element);/*** 在index位置插入一个元素*/void add(int index, E element);/*** 删除index位置的元素*/E remove(int index);/*** 查看元素的索引*/int indexOf(E element);
}
package 链表;public abstract class AbstractList<E> implements List<E>{/*** 元素的数量*/protected int size;/*** 元素的数量 */public int size() {return size;}/*** 是否为空*/public boolean isEmpty() {return size == 0;}//封装报错protected void outOfBounds(int index) {throw new IndexOutOfBoundsException("Index"+index+",Size:"+size);}protected void rangeCheck(int index) {if(index<0||index>=size) {outOfBounds(index);}}protected void rangeCheckForAdd(int index) {if(index<0||index>size) {outOfBounds(index);}}/*** 是否包含某个元素*/public boolean contains(E element) {return indexOf(element)!=ELEMENT_NOT_FOUND;}/*** 添加元素到尾部*/public void add(E element) {add(size,element);}
}
package 链表;
public class LinkedList<E> extends AbstractList<E>{// 因为继承自AbstractList,所以不需要:private int size;否则会报越界异常//头结点private Node<E> first;private static class Node<E> {E element;Node<E> next;public Node(E element,Node<E> next) {this.element = element;this.next = next;}}public void clear() {size = 0;first = null;}public int size() {return size;}public boolean isEmpty() {return size == 0;}public boolean contains(E element) {return indexOf(element)!=ELEMENT_NOT_FOUND;}public E get(int index) {return node(index).element;}public E set(int index, E element) {Node<E> node = node(index);E oldE = node.element;node.element = element;return oldE;}public void add(int index, E element) {if(index == 0) {System.out.println("已进入");first = new Node<>(element, first);}else {Node<E> preNode = node(index-1);//将结点2插入结点1和结点3中间:先让结点2指向结点3,然后让结点1指向结点2!!!preNode.next = new Node<>(element, preNode.next);}size++;}public E remove(int index) {rangeCheck(index);Node<E> node = first;if (index == 0) {first = first.next;}else {Node<E> preNode = node(index-1);node = preNode.next;preNode.next = node.next;           }size--;return node.element;}public int indexOf(E element) {if(element==null) {Node<E> node = first;for (int i = 0; i < size; i++) {if (node.element == null) {return i;}node = node.next;}}else {Node<E> node = first;for(int i=0;i<size;i++) {if(element.equals(node.element)) return i;node = node.next;}}return ELEMENT_NOT_FOUND;}/*** @Description:获取index位置对应结点对象*/private Node<E> node(int index) {rangeCheck(index);Node<E> node = first;for (int i = 0; i < index; i++) {node = node.next;}return node;}public String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("size=").append(size).append(",[");Node<E> node = first;for (int i = 0; i < size; i++) {if(i!=0) {stringBuilder.append(",");}stringBuilder.append(node.element);node = node.next;}stringBuilder.append("]");
//      Node<E> node1 = first;
//      while(node1!=null) {//          node1 = node1.next;
//      }return stringBuilder.toString();}
}
package 链表;
//消除警告
@SuppressWarnings("unchecked")public class ArrayList<E> extends AbstractList<E>{/*** 所有的元素*/private E[] elements;private static final int DEFAULT_CAPACITY = 10;//初始化数组public ArrayList(int capaticy) {capaticy = (capaticy<DEFAULT_CAPACITY)?DEFAULT_CAPACITY:capaticy;//因为所有类都继承自object,所以先new Object数组,再强转elements = (E[])new Object[capaticy];}//无参数则默认大小为10public ArrayList() {//调用有参的构造函数!!!this(DEFAULT_CAPACITY);}/*** 清除所有元素*/public void clear() {for (int i = 0; i < size; i++) {elements[i] = null;}//不能用:elements = null; 因为会断掉数组(栈)指向堆的空间,堆内部东西会销毁,每次都需要重新开辟空间。size = 0;}/*** 获取index位置的元素*/public E get(int index) {rangeCheck(index);return elements[index];}/*** 设置index位置的元素* @return 历史的元素*/public E set(int index,E element) {rangeCheck(index);E old = elements[index];elements[index] = element;return old;}/*** 在index位置插入一个元素*/public void add(int index,E element) {rangeCheckForAdd(index);ensureCapacity(size+1);for (int i = size-1; i >= index; i--) {elements[i+1] = elements[i];}elements[index] = element;size++;}/*** 删除index位置的元素*/public E remove(int index) {rangeCheck(index);E old =  elements[index];for (int i = index+1; i < size; i++) {elements[i-1] = elements[i];}elements[--size]=null;return old;}/*** 查看元素的位置*/public int indexOf(E element) {if(element==null) {for (int i = 0; i < size; i++) {if (elements[i] == null) {return i;}}}else {for(int i=0;i<size;i++) {if(elements[i].equals(element)) return i;}}return ELEMENT_NOT_FOUND;}/*** 数组转换成字符串*/@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("size=").append(size).append(",[");for (int i = 0; i < size; i++) {if(i!=0) {stringBuilder.append(",");}stringBuilder.append(elements[i]);
//          if(i!=size-1) {//              stringBuilder.append(",");
//          }}stringBuilder.append("]");return stringBuilder.toString();}/*** @Description:保证容量至少有capacity*/private void ensureCapacity(int capacity) {int oldCapacity = elements.length;if(oldCapacity>=capacity) return;//新容量为旧容量的1.5倍int newCapacity = oldCapacity+(oldCapacity>>1);E[] newElements = (E[])new Object[newCapacity];//将原数组的元素填入新数组for (int i = 0; i < size; i++) {newElements[i] = elements[i];}//原数组指向新数组elements = newElements;System.out.println("扩容:"+oldCapacity+"至"+newCapacity);}
}

2 虚拟头结点:减少头结点与其他结点操作差异

package 链表;
/*** 增加虚拟头结点*/
public class LinkedList2<E> extends AbstractList<E>{private Node<E> first;//虚拟头结点public LinkedList2() {first = new Node<>(null, null);}
...public void add(int index, E element) {rangeCheckForAdd(index);Node<E> preNode = index == 0?first:node(index-1);preNode.next = new Node<>(element, preNode.next);size++;}public E remove(int index) {rangeCheck(index);Node<E> preNode = index == 0?first:node(index-1);Node<E> node = preNode.next;preNode.next = node.next;         size--;return node.element;}
...
}

数据结构与算法学习笔记02-单向链表相关推荐

  1. 数据结构与算法学习笔记02-双向链表

    1 String.StringBuffer.StringBuilder区别 String类一旦声明不可以改变,只能改变内存指向: StringBuffer对字符串增删,线程安全.速度慢 StringB ...

  2. 数据结构与算法学习笔记之先进先出的队列

    前言 队列是一种非常实用的数据结构,类似于生活中发排队,可应用于生活,开发中各个方面,比如共享打印机(先请求先打印),消息队列.你想知道他们是怎么工作的么.那就来一起学习一下队列吧 正文 一.队列的定 ...

  3. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  4. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  5. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  6. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  7. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

  8. 数据结构与算法(六)- 单向链表的反转

    数据结构与算法(六)- 单向链表的反转 一.头节点插入法 /*** 反转单向链表(头插法)** 1.先定义一个节点reverseHead = new HeroNode()* 2.从头到尾遍历原来的链表 ...

  9. 06_JavaScript数据结构与算法(六)单向链表

    JavaScript 数据结构与算法(六)单向链表 认识链表 链表和数组 链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同. 数组 存储多个元素,数组(或列表)可能是最常用的 ...

最新文章

  1. flash build 4.6 不能debug 报错 C:\WINDOWS\system32\...
  2. 晶科电力打造江苏省南通市大分布式光伏项目
  3. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task5:模型训练与验证
  4. 03 渲染元素ReactDOM.render
  5. mysql用in查询list_Mysql优化器对in list的处理
  6. Spring中的事务回滚 网上比较不错的文章
  7. varnish工作原理详细讲解
  8. matlab详细手册,matlab详细手册
  9. 1核2g服务器能干什么_国内哪个云服务器比较便宜性价比高?大家有什么好推荐...
  10. Java 实现MD5
  11. 简历制作-技术栈和项目经历如何写?
  12. 东华复试OJ-43 丑数
  13. 计算机丢失dll文件夹,简单几招教你解决windows7旗舰版丢失dll文件
  14. Revel框架搭建的后台管理系统脚手架
  15. 此计算机未安装程序,此计算机上未安装 Windows 组件 Server-Gui-Mgmt-Infra
  16. CleanMyMac4.12最新版mac系统内存空间清理教程
  17. [pwn]堆:fastbin attack详解
  18. 《搜索和推荐中的深度匹配》——1.5 近期进展
  19. php注册登录课件,登录注册验证(javascript)-php教学课件5.pdf
  20. R语言的修仙之道--R语言之后天境界

热门文章

  1. 手机压缩包删除有什么后果?
  2. 芯片14纳米与7纳米相比,是不是芯片大一点,性能差不太多呢?
  3. On September 8, the “PDF first share“ Foxit Software
  4. MySql 中的 int(11) 到底代表什么意思?
  5. 前缀,中缀,后缀表达式求值
  6. db2 联合数据源 mysql_详解DB2中联合SQL Server数据
  7. 用集合编写的java通讯录_java使用集合实现通讯录功能
  8. sql azure 语法_将SQL工作负载迁移到Microsoft Azure:服务选择
  9. 学习SQL:SQL Server数据透视表
  10. sp_help用法_sp_updatestats概述和用法