Java中集合(四)LinkedList
一、概述
- 基于链表
- 内存空间不连续。增删较快,查询首尾特快 ,但是查询其他位置较慢
- 元素可以重复,列表中的元素会被自动编号
- 本身是线程不安全的集合
- 每一个元素都有三部分组成: 头部:存放上一个节点的地址 ,中部:存放数据 ,尾部: 存放下一个节点的地址
练习: 自己实现一个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相关推荐
- java中ArrayList和LinkedList的区别
首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...
- Java中的四个核心技术思想
Java中的四个核心技术思想 对Java核心概念和思想的掌握有助于提升我们对整个Java平台的理解力.这里将介绍四个Java中的核心技术思想,包括Java虚拟机.类装载器的体系结构.class文件和A ...
- java中集合的分类以及集合的选择
一.java中的集合 一般同学都是从c语言起步的,刚开始使用java时,会对集合这个概念比较陌生,在c语言中我们表示数据的集合往往使用数组,在编写c程序时觉得数组完全可以满足我们的基本需要.而到了ja ...
- Java 中的四种引用
垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进行垃圾回收之前,虚拟 ...
- java中集合的排序
java中集合的排序 import java.util.Set; import java.util.HashSet; import java.util.List; import java.util.A ...
- java中集合选取怎么选_集合中的可选
java中集合选取怎么选 有时有人认为Optional类型值得在集合中使用. 据称,它解决了以下问题: HashMap在没有键映射以及值null映射到键的情况下返回null . 如果使用Map< ...
- java中集合判空_Java中的类型安全的空集合
java中集合判空 我以前曾在Java Collections类的实用程序上进行过博客撰写,并且特别地在使用Usings Collections Methods上的博客emptyList(),empt ...
- Java中集合拥有的共性方法
在Java中集合的共性方法 1.在Java中集合作为最顶层的集合,他拥有所有集合有的共性方法.所以在定义实现类的时候可以使用多态. 集合拥有的共性方法: public boolean add(E e) ...
- java中的四种代码块
原文链接: java中的四种代码块_Munt的博客-CSDN博客_java中代码块 在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造 ...
- java 代码块_详解java中的四种代码块
在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...
最新文章
- 小程序 data-***自定义
- 首次使用Cesium加载3D数据成功
- boost::contract模块实现简单queue的测试程序
- javaweb学习总结(三十九):数据库连接池
- OpenStack Telemetry系统架构及实践
- 使用URI设计松散耦合的Metro应用程序
- 在ubuntu 12.04上安装tomcat 7.40
- pytorch1.7教程实验——对抗示例生成FGSM
- 这个火热的社区都升级到2.0了,你还不知道它?
- java 之 servlet简介
- 记一次设置密钥登陆centos7所遇问题
- IEEE会议Latex模板下载教程
- maximo数据集列表关联其他表字段
- 超实用工具:获取法定节假日、休息日、周末天数
- 【分享】如何判断个人电脑是多少位(32位?还是64位系统)
- 关于TCP乱序和重传的问题
- http://www.51it.org/zz/zzjx1/zzjx15/200604/51559.html
- 使用wget下载GEO数据
- 运行无法打开计算机策略,“组策略不能打开”的解决方案
- MacW资讯:苹果mac触摸板使用技巧
热门文章
- 关系数据库中,表中的每行就是一个对象
- 顺序容器及其常用函数
- ATL dll注册失败
- python中转义字符怎么用_python中的转义字符i
- 光子 量子 DNA计算机的发展情况,科研萌新关于非冯诺依曼结构计算机的一些知识mewo~~...
- 正态分布图_用EXCEL简易制作正态分布图
- Groovy 1.5.7 出现java.lang.LinkageError问题
- BZOJ3473: 字符串【后缀数组+思维】
- 浅谈 温故知新——HTML5!
- Fragment 与 Fragment 相互传值