Java数据结构-------单链表(图解增删改查详细实现,附反转链表实现)(上)

简介: 目录 1.什么是链表? 2.单链表的基本功能和结构3.单链表基本功能代码具体实现 1.清空链表,获取链表长度,判断链表是否为空 2.获取指定位置的元素 3.像链表中添加元素t 4.向指定位置i处插入元素t 5.删除指定位置i处的元素,并返回该元素 6.查找元素第一次出现的位置 7.反转链表

1.什么是链表?


一:链表是什么


1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。


2、结点包括两个部分:(1)存储数据元素的数据域(内存空间),(2)存储指向下一个结点地址的指针域。


3、相对于线性表顺序结构,操作复杂。


4.链表分为 (1)单链表 (2)双链表 (3)单向循环链表 (4)双向循环链表

画个图让大家更好理解两者的优缺点


image.png


2.单链表的基本功能和结构


public class Linklist<T>  {
    //记录头结点
    private Node head;
    //记录链表的长度
    private int N;
    //结点类
    private class Node{
        //存储数据
        T item;
        //下一个结点
        Node next;
        public Node(T item, Node next){
            this.item=item;
            this.next=next;
        }
    }
    //构造方法
    public Linklist() {
        //初始化元素个数
        this.N=0;
        //初始化头结点
        this.head=new Node(null,null);
    }

解析: 单链表需要一个头结点和一个int类型的变量N记录元素的个数。因为一个结点需要有数据域和指针域,所以我们单链表内需要有一个内部类Node表示结点。因为我们还不能确定存放的数据类型,所以用泛型T表示存放的数据类型的成员变量,因为next指的是下一个结点,所以需要一个Node类型的成员变量。链表的构造方法刚开始没有元素所以让N为0,头结点head的数据域不存放元素所以为null,还没有插入元素所以它的next也为null


下面是单链表需要实现的基本API


public void clear()
清空链表
public int getN()
获取链表的长度
public boolean isEmpty()
判断链表是否为空
public T get(int i)
获取指定位置i的元素
public void add(T t)
向链表中添加元素t
public void insert(int i,T t)
向指定位置i处添加元素
public T remove(int i)
删除指定位置处i处的元素,并返回被删除的元素
public int indexOf(T t)
查找元素第一次出现的位置
public void reverse()
用来反转整个链表


3.单链表基本功能代码具体实现


1.清空链表,获取链表长度,判断链表是否为空


//清空链表
    public void clear(){
        head.next=null;
        this.N=0;
    }
    //获取链表的长度
    public int getN(){
        return N;
    }
    //判断链表是否为空
    public boolean isEmpty(){
        return N==0;
    }

解析:因为链表的查询需要从头结点一个个next查找下去,如果头结点的next直接为null,那我们就什么也查不到了,链表就变成空,同时让N为0。获取链表的长度直接返回N的值即可。判断链表是否为空我们返回N是否等于0即可。


2.获取指定位置的元素


//获取指定位置i的元素
    public T get(int i){
        //通过循环,从头结点往后找
        Node n=head.next;
        for (int j = 0; j <i; j++) {
           n=n.next;
        }
        return n.item;
    }


解析:我们首先建立一个Node结点n并将它赋值为头结点的下一个结点,通过for循环,我们一个一个遍历下去直到找到我们指定的位置i。这里我们要注意循环的判定条件,我们走一次循环就走一个结点,因为我们是从第一个结点开始,所以需要走i-1次循环,如果你的n设的是head,那我们就要走i次循环,判定条件应为j<=i。


3.像链表中添加元素t


//向链表中添加元素t
    public void add(T t){
        //找到当前最后一个结点
        Node n=head;
        while (n.next!=null){
            n=n.next;
        }
        //创建新节点保存元素
        Node node = new Node(t,null);
        n.next=node;
        //元素个数加1
        N++;
    }


解析:添加元素,我们需要找到最后一个结点,此时它的next是null,我们设一个结点n赋值为头结点,用while循环不断更新为下一个结点,当它的下一个结点为null时说明我们n已经成为了最后一个结点。得到最后一个结点后我们新建立一个结点node,它的数据域填充我们的需要插入的元素t,让它接在我们的最后一个结点后,然后让N加一,我们的添加就完成了。要在尾部添加元素,单链表必须要从头遍历到尾部,在这方面单链表比不上顺序表。但插入到具体的位置的操作单链表却具有顺序表不具有的优点。


相关文章
|
6月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
167 1
|
4月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
198 3
|
12月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
122 1
|
12月前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
205 2
|
12月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
237 2
|
6月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
478 1
|
10月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
146 5
|
12月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
179 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
11月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
173 6
|
11月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。