单链表的基本操作(Java实现)

简介: 单链表的基本操作(Java实现)

单链表的基本操作(Java实现)


1.单链表简介:


线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。


链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

以“结点的序列”表示线性表称作线性链表(单链表),单链表是链式存取的结构。


2.单链表的一些特征总结:


利用Java实现一个简单的单链表存储结构,即结点,可以用以下语句来实现:

public class LinkedList {
    public int data;      //数据域,存放结点的数据
    public LinkedList next;   //指针域,指向下一个结点
    public LinkedList(int data){
       this.data=data;
    }
}

由于单链表存储结构的特点,整个链表的存取必须从头指针开始进行。

假设链表为image.png,先创建一个头结点对象:LinkedList head=new LinkedList(0);,让头结点的指针域指向链表的第一个结点,则有head.next=a1;;

如果head.next==null,也就是头结点的下一个结点为空,很显然就是链表为空;

假设一个指针temp指向了链表的最后一个结点,即temp=a5时,显然a 5后面已经没有元素了,那么就可以用temp.next=null;来表示链表为空的情况。


3.方法代码实现


3.1判断链表是否为空


/**
 * 判断链表是否为空
 */
    public boolean isEmpty(){
        boolean flag=false;   //假定链表不为空
        if (head.next==null){
            flag=true;      //头结点的next如果为null,说明链表中不含有其他元素,故链表为空,置flag为true
        }
        return flag;    //返回flag,可用于后续方法
    }
3.2往链表尾部添加结点


思路:先定义一个辅助指针temp,遍历链表,让辅助指针指向链表的最后一个结点,然后让temp.next指向要添加进链表的结点。


 /**
     * 往链表尾部添加新结点
     * @param element 要添加进链表的结点
     */
    public void add(LinkedList element){
        //因为头结点head不能动,所以建立一个临时结点temp来作为辅助
        LinkedList temp=head;
        //遍历当前链表,找到最后一个结点
        while (true){
            if (temp.next==null){//temp若为链表尾部的结点,故temp.next为null时,就是链表的最后一个结点了
                break;
            }
            temp=temp.next;//让temp指向temp.next,也就是让temp结点后移了,从而实现遍历
        }
        //当循环退出后,temp就指向了当前链表的最后一个元素,修改temp的next域,让其指向新的节点即可。
        temp.next=element;
    }
3.3遍历链表,并输出每个结点的数据域


思路:先定义一个辅助指针temp,然后写一个whlie循环,利用temp=temp.next语句来遍历链表,每遍历到一个结点就输出其数据域的值到控制台,当辅助指针指向链表的最后一个结点的下一个位置时,退出循环。

/**
     * 遍历链表
     */
    public void showList(){
        if (isEmpty()){
            System.out.println("链表为空");
            return;
        }
        //如果链表不为空,遍历链表并打印
        LinkedList temp=head;
        while (true){
            if (temp==null){//当temp指向链表中最后一个结点的next时,遍历结束,输出提示信息,跳出循环
                System.out.println("遍历结束");
                break;
            }
            if (temp.next!=null){//temp一开始指向头结点,但头结点不应属于链表内,故从temp.next.data开始打印
                System.out.printf("%d ",temp.next.data);
            }
            temp=temp.next;//把temp.next赋给temp,实现遍历
        }
    }


相关文章
|
3月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
7月前
|
存储 Java
Java数据结构:链表
Java数据结构:链表
47 2
|
6月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
4月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
117 0
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
55 0
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
46 0
|
7月前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
60 2
|
6月前
|
算法 Java C语言
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
40 1
|
6月前
|
算法 安全 Java
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
39 1