文章概述
本文中小编为大家介绍了java中超级好用的LinkedList类 , 以及如何自己手动实现一个LinkedList。
Ja va编程学习交流社 君羊 881 982657 货取最新基础资料教程工聚等干货
一、Java中LinkedList概述
-
基于链表 , 并且在Java中是以双向链表实现的
-
内存空间不连续。增删较快,查询首尾特快 ,但是查询其他位置较慢
-
元素可以重复,列表中的元素会被自动编号
-
本身是线程不安全的集合
-
每一个元素都有三部分组成: 头部:存放上一个节点的地址 ,中部:存放数据 ,尾部: 存放下一个节点的地址
二、练习: 自己实现一个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++; } @Override public 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")); } }
后记
感谢各位客官的阅读 , 如果文章中有错误或剖析的不够透彻还请您能够给不吝赐教在评论中告诉小编 , 以便小编能够及时调整文章内容 , 为大家带来更加优质的文章