简谈JAVA基础--单链表
来源:互联网 发布:网络高级工程师认证 编辑:程序博客网 时间:2024/06/05 18:52
链表为数据结构中的一种,分为单链表和双链表。
例如在HashMap的底层数据结构中就采用了单链表来进行存储。LinkedList采用了双向链表来进行存储。
这里主要记录一下单链表的学习和理解。
单链表的存储类似栈,是一种先进后出的原则。在链表中插入时直接插入到表头。这种原则决定了链表的操作效率很高但是遍历并不高。
如果采用尾插法效率会很慢,所以采用插入到表头的方式。
单链表的内容由一个个Node节点组成,每个节点通常包含两部分:data 节点数据,next 下个节点的地址。
任何的操作都通过head节点来开始进行。因为只有每个节点才知道下一个节点的所在。(在内存中每个节点并不是连续的,所在位置由上一个节点所知)。
这是由5个节点组成的链表, 头节点head为A,而除头节点外,所有的节点都由上个节点的next指针指向。
因为是先进后出原则,在添加新的节点时,是从右至左操作的,直接添加在头节点,例如插入F 节点。
Head F -> A -> B -> C -> D -> E ->^ 。这时F的next指针指向A的地址0001 。
简单实现单链表增删改查。
package Chapter1;/*** 单链表实现* <p>* Created by yu on 2017/9/12.*/public class LinkList<T> { /** * 内部节点类 */ class Node<N> { private Node<N> next; private N data; public Node(N data) { this.data = data; } } /** * 头结点 **/ private Node head = null; public LinkList() { } /** * 添加一个节点,采用插入表头原则。 */ public void addNode(T data) { Node node = new Node<>(data); node.next = head; head = node; } /** * 打印链表 */ public void print() { Node node = head; for (; node != null; node = node.next) { System.out.print(node.data + " "); } System.out.println(); } /** * 判断链表是否为空 */ public Boolean isEmpty() { if (head == null) { return true; } return false; } /** * 删除一个元素,直接删除头元素。效率很高 */ public void removeByHead() { if (!isEmpty()) { head = head.next; return; } System.out.println("List is null"); } /** * 删除链表中遇到的第一个内容相同元素 */ public void removeByData(T data) { if (!isEmpty()) { Node node = head, before = null; while (node != null) { if (node.data.equals(data)) { if (before == null) { head = head.next; } else { before.next = node.next; } return; } before = node; node = node.next; } } System.out.println("List is null"); } /** * 替换链表中遇到的第一个内容相同元素 */ public void repalce(T srcData, T proData) { Node node = head; while (node != null) { if (node.data.equals(srcData)) { node.data = proData; return; } node = node.next; } } /** * 查询链表中遇到的第一个元素所在位置 * 如果链表为空或者未找到返回-1 */ public int indexOf(T data) { if (isEmpty()) { return -1; } int index = 0; Node node = head; while (node != null) { if (node.data.equals(data)) { return index; } node = node.next; index++; } return -1; } public static void main(String[] args) { LinkList<String> linkList = new LinkList<String>(); linkList.addNode("1"); linkList.addNode("3"); linkList.addNode("5"); linkList.addNode("4"); linkList.addNode("5"); linkList.addNode("7"); System.out.print("初始链表为:"); linkList.print(); linkList.repalce("4", "9"); System.out.print("替换后的链表为:"); linkList.print(); System.out.println("链表是否为空:" + linkList.isEmpty()); linkList.removeByData("5"); System.out.print("删除指定元素后的链表为:"); linkList.print(); System.out.println("元素所在的索引位置:" + linkList.indexOf("3")); }}
阅读全文
0 0
- 简谈JAVA基础--单链表
- 简谈JAVA基础--数据类型
- 简谈JAVA基础--数据类型
- 简谈JAVA基础--HashMap
- 简谈JAVA基础--HashTable
- 简谈JAVA基础--ArrayList
- 简谈JAVA基础--ConcurrentHashMap
- 简谈JAVA基础--List列表
- 简谈JAVA基础--IO流
- Java基础之翻转单链表
- java实现单链表,巩固基础
- Java基础01:基础
- Java基础:基础加强
- Java基础-基础
- java基础的基础
- JAVA基础---基础常识
- Java基础:基础加强
- [Java 基础]基础语法
- Lucene学习总结之七:Lucene搜索过程解析(3)
- 系统学习深度学习(四十)--MS-CNN
- 逼格高又实用的Linux高级命令,开发运维都要懂
- 判断某个对象是否是空对象
- [中等] UVa OJ 12186 Another Crisis
- 简谈JAVA基础--单链表
- Java IO包装流如何关闭?(关闭顺序)
- 笔记本不显示“选择关闭盖子的功能”
- 小技巧
- Eclipse中Web项目出现感叹或红叉该怎么解决?
- java 运算符
- Flum+hdfs
- CasperJS API 第三篇
- ThreadLocal使用