一、概述

  1. 基于链表
  2. 内存空间不连续。增删较快,查询首尾特快 ,但是查询其他位置较慢
  3. 元素可以重复,列表中的元素会被自动编号
  4. 本身是线程不安全的集合
  5. 每一个元素都有三部分组成: 头部:存放上一个节点的地址   ,中部:存放数据  ,尾部: 存放下一个节点的地址

练习: 自己实现一个LinkedList  ,里面存放String类型的值

public class LinkedListDemo {/************************************************/// 定义一个节点类private class Node {Node prev;// 上一个节点String data;// 数据Node next; // 下一个节点public Node(Node prev, String data, Node next) {super();this.prev = prev;this.data = data;this.next = next;}public String getData() {return data;}public void setData(String data) {this.data = data;}}/************************************************/private Node frist; // 头节点private Node last;// 尾节点private int size;// 节点个数public LinkedListDemo() {// frist = last;}public void add(String str) {// 如果是头结点,直接指向新街点if (frist == null) {this.frist = new Node(null, str, null);// 因为只有以后各节点,所以头尾一致this.last = this.frist;} else {// 如果不是头结点 ,新街点指向原来的尾节点Node node = new Node(this.last, str, null);// 尾节点指向新街点this.last.next = node;this.last = node;}size++;}public void remove(int index) {// 判断下标越界if (index >=size||index<0) {throw new IndexOutOfBoundsException("Index:" + index);}// 记录要找的节点Node node = this.frist;for (int i = 0; i <index; i++) {node = node.next;}// 获取要删除的节点的上一个和下一个节点Node prev = node.prev;Node next = node.next;if(index==0){this.frist = next;}else if(index == size-1){this.last = prev;}else{// 把原本下一位的头结点指向上一位的尾节点prev.next = next;// 把原本上一位的尾节点指向下一位next.prev = prev;}// 元素个数少一size--;}public int indexOf(String str) {Node node = this.frist;for (int i = 0; i < size; i++) {if (node.data == str || str != null && str.equals(node.data)) {return i;}// 指向下一节点node = node.next;}return -1;}public void add(int index, String str) {Node node = new Node(null, str, null);// 判断下标是否越界if (index > size) {throw new IndexOutOfBoundsException();} else if (index == 0) {node.next = this.frist;this.frist = node;} else {// 查找占用这个位置的当前元素Node no = this.frist;for (int i = 0; i < index; i++) {no = no.next;}// 记录这个位置的前后节点Node prev = no.prev;Node next = no.next;// 在node和上一个节点之间插入一个元素prev.next = node;no.prev = prev;node.next = no;no.prev = node;}size++;}@Overridepublic String toString() {Node node = this.frist;//System.out.println(node.data);StringBuilder sb = new StringBuilder();sb.append("[");for (int i = 0; i < size; i++) {sb.append(node.data+",");node = node.next;}String str = sb.toString();str = str.substring(0,str.length()-1);str += "]";return str;}
}
public static void main(String[] args) {LinkedListDemo l = new LinkedListDemo();//添加元素l.add("aa");l.add("bb");l.add("cc");l.add("dd");//向指定位置添加元素l.add(1, "ee");l.add(0, "ff");System.out.println(l);//移除元素l.remove(3);System.out.println(l);//获取指定元素的位置System.out.println(l.indexOf("aa"));}
}

Java中集合(四)LinkedList相关推荐

  1. java中ArrayList和LinkedList的区别

    首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...

  2. Java中的四个核心技术思想

    Java中的四个核心技术思想 对Java核心概念和思想的掌握有助于提升我们对整个Java平台的理解力.这里将介绍四个Java中的核心技术思想,包括Java虚拟机.类装载器的体系结构.class文件和A ...

  3. java中集合的分类以及集合的选择

    一.java中的集合 一般同学都是从c语言起步的,刚开始使用java时,会对集合这个概念比较陌生,在c语言中我们表示数据的集合往往使用数组,在编写c程序时觉得数组完全可以满足我们的基本需要.而到了ja ...

  4. Java 中的四种引用

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...

  5. java中集合的排序

    java中集合的排序 import java.util.Set; import java.util.HashSet; import java.util.List; import java.util.A ...

  6. java中集合选取怎么选_集合中的可选

    java中集合选取怎么选 有时有人认为Optional类型值得在集合中使用. 据称,它解决了以下问题: HashMap在没有键映射以及值null映射到键的情况下返回null . 如果使用Map< ...

  7. java中集合判空_Java中的类型安全的空集合

    java中集合判空 我以前曾在Java Collections类的实用程序上进行过博客撰写,并且特别地在使用Usings Collections Methods上的博客emptyList(),empt ...

  8. Java中集合拥有的共性方法

    在Java中集合的共性方法 1.在Java中集合作为最顶层的集合,他拥有所有集合有的共性方法.所以在定义实现类的时候可以使用多态. 集合拥有的共性方法: public boolean add(E e) ...

  9. java中的四种代码块

    原文链接: java中的四种代码块_Munt的博客-CSDN博客_java中代码块 在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造 ...

  10. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

最新文章

  1. 小程序 data-***自定义
  2. 首次使用Cesium加载3D数据成功
  3. boost::contract模块实现简单queue的测试程序
  4. javaweb学习总结(三十九):数据库连接池
  5. OpenStack Telemetry系统架构及实践
  6. 使用URI设计松散耦合的Metro应用程序
  7. 在ubuntu 12.04上安装tomcat 7.40
  8. pytorch1.7教程实验——对抗示例生成FGSM
  9. 这个火热的社区都升级到2.0了,你还不知道它?
  10. java 之 servlet简介
  11. 记一次设置密钥登陆centos7所遇问题
  12. IEEE会议Latex模板下载教程
  13. maximo数据集列表关联其他表字段
  14. 超实用工具:获取法定节假日、休息日、周末天数
  15. 【分享】如何判断个人电脑是多少位(32位?还是64位系统)
  16. 关于TCP乱序和重传的问题
  17. http://www.51it.org/zz/zzjx1/zzjx15/200604/51559.html
  18. 使用wget下载GEO数据
  19. 运行无法打开计算机策略,“组策略不能打开”的解决方案
  20. MacW资讯:苹果mac触摸板使用技巧

热门文章

  1. 关系数据库中,表中的每行就是一个对象
  2. 顺序容器及其常用函数
  3. ATL dll注册失败
  4. python中转义字符怎么用_python中的转义字符i
  5. 光子 量子 DNA计算机的发展情况,科研萌新关于非冯诺依曼结构计算机的一些知识mewo~~...
  6. 正态分布图_用EXCEL简易制作正态分布图
  7. Groovy 1.5.7 出现java.lang.LinkageError问题
  8. BZOJ3473: 字符串【后缀数组+思维】
  9. 浅谈 温故知新——HTML5!
  10. Fragment 与 Fragment 相互传值