iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现单链表的操作
  • 326
分享到

Java实现单链表的操作

2024-04-02 19:04:59 326人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了Java实现单链表的基本操作,供大家参考,具体内容如下 顺序表:物理上逻辑上都连续;链表:物理上不一定连续,逻辑上一定连续的。 链表的概念及结构 概念:连表示一种

本文实例为大家分享了Java实现单链表的基本操作,供大家参考,具体内容如下

顺序表:物理上逻辑上都连续;
链表:物理上不一定连续,逻辑上一定连续的。

链表的概念及结构

概念:连表示一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是用过链表中的引用链接次序实现的。

8种链表结构:

单项、双向
带头、不带头
循环、非循环

主要的三种链表:

无头单项非循环链表、带头循环单链表、不带头双向循环链表

代码实现

1. 接口定义

package com.GitHub.linked.Impl;

public interface ILinked {
    // 头插法
    void addFirst(int data);

    // 尾插法
    void addLast(int data);

    // 任意位置插入,第一数据节点为0号下标
    boolean addIndex(int index, int data);

    // 查找是否包含关键字 key 在单链表中
    boolean contains(int key);

    // 删除第一次出现的关键字为 key 的节点
    int remove(int key);

    // 删除所有值为 key 的节点
    void removeAllKey(int key);

    // 得到单链表的长度
    int getLength();

    // 打印单链表
    void display();

    // 清空单链表以防内存泄漏
    void clear();
}

2. 代码实现接口

package com.github.linked.Impl;

public class SingleListed implements ILinked {

    // 节点类
    class node {
        private int data;
        private Node next;

        public Node(int data) {
            this.data = data;
            this.next = next;
        }
    }

    private Node head; //头节点
    public SingleListed() {
        this.head = head;
    }

    
    @Override
    public void addFirst(int data) {
        // 1. 拿到一个实体
        Node node = new Node(data);

        // 2. 插入
        // 如果是第一次插入,直接到头节点
        if (this.head == null) {
            this.head = node;
        } else { //不是第一次插入
            node.next = this.head; // 插入的节点指向头节点
            this.head = node;      // 更新头节点
        }
    }

    
    @Override
    public void addLast(int data) {
        // 1. 拿到一个实体
        Node node = new Node(data);
        Node cur = this.head;

        // 2. 插入
        // 如果是第一次插入,直接到头节点
        if (this.head == null) {
            this.head = node;
        } else {
            // 找尾巴
            while (cur.next != null) {
                cur = cur.next;
            }
            // 退出上面的循环,cur所执行的位置就是尾节点
            cur.next = node;
        }
    }

    // 检测 index 该下标是否合法
    private void checkIndex(int index) {
        if (index < 0 || index > getLength())
            throw new IndexOutOfBoundsException("下标不合法!");
    }

    // 找到下标为 index-1 位置的节点
    private Node searchIndex(int index) {
        checkIndex(index);
        if (index == 0)
            return null;
        int count = 0; // 记录行走的步数
        Node cur = this.head;

        while (cur.next != null && count < index-1) {
            cur = cur.next;
            count++;
        }

        return cur;
    }

    
    @Override
    public boolean addIndex(int index, int data) {
        Node node = new Node(data);
        Node cur = searchIndex(index);

        // 如果链表为空,直接插入到头节点
        if (cur == null) {
            node.next = this.head;
            this.head = node;
        } else { // 链表不为空,插入到 cur 的位置处
            node.next = cur.next;  // 将node链接到cur的下一个节点
            cur.next = node;       // 再将cur链接到node
        }

        return true;
    }

    
    @Override
    public boolean contains(int key) {
        Node cur = this.head;
        while (cur != null) {
            if (cur.data == key) {
                return true;
            }
            cur = cur.next;
        }

        return false;
    }

    // 找第一次出现的关键字为 key 的节点的前驱
    private Node searchPre(int key) {
        // 1. 是不是第一个节点 if(head,data == key)
        Node pre = this.head;
        if (pre.data == key) {
            // 或者 return null;
            return this.head;
        }

        // 2. if(cur.next.data == key)
        while (pre.next != null) {
            if (pre.next.data == key) {
                return pre;
            }
            pre = pre.next;
        }

        return null;
    }

    
    @Override
    public int remove(int key) {
        int oldData = 0;
        Node pre = searchPre(key);

        // 1. 若没有找到
        if (pre == null) {
            // return -1;
            throw new UnsupportedOperationException("没有key的前驱");
        }

        // 2. 找到了,并且在第一个节点
        if (pre == this.head && pre.data == key){
            oldData = this.head.data;
            this.head = this.head.next;
            return oldData;
        }

        // 3. 找到了,并且不在第一个节点
        Node delNode = pre.next; // 确定要删除的节点的位置
        pre.next = delNode.next; // 让要删除的节点的前驱指向要删除的节点的后一个节点,进而删除该节点

        return 0;
    }

    
    @Override
    public void removeAllKey(int key) {
        Node pre = this.head;
        Node cur = this.head.next;

        // 遍历一遍链表
        while (cur != null) {
            // 若找到了关键字,进行删除
            if (cur.data == key) {
                pre.next = cur.next;
                cur = cur.next;
            } else { // 若不是关键字,继续查看链表的下一个
                pre = cur;
                cur = cur.next;
            }
            if (this.head.data == key) {
                this.head = this.head.next;
            }
        }
    }

    
    @Override
    public int getLength() {
        Node cur = this.head;
        int count = 0;  // 节点的个数
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }

    
    @Override
    public void display() {
        Node cur = this.head;
        while (cur != null) {
            System.out.print(cur.data + " ");
            cur = cur.next;
        }
        System.out.println();
    }

    
    @Override
    public void clear() {
        while (this.head != null) {
            Node cur = this.head.next;
            this.head.next = null;
            this.head = cur;
        }
    }
}

3. 测试代码

package com.github.linked.Impl;

public class TestDemo {
    public static void main(String[] args) {

        //MySingleListImpl mySingleList = new MySingleListImpl();
        SingleListed mySingleList = new SingleListed();

        mySingleList.addFirst(10);
        mySingleList.addFirst(20);
        mySingleList.addFirst(30);
        mySingleList.addFirst(40);
        mySingleList.addFirst(50);
        System.out.println("头插:");
        mySingleList.display();

        mySingleList.addLast(100);
        mySingleList.addLast(200);
        System.out.println("尾插:");
        mySingleList.display();
        System.out.println();

        System.out.print("单链表的长度:");
        System.out.println(mySingleList.getLength());
        System.out.println();

        mySingleList.addIndex(1,15);
        System.out.println("任意位置插入:");
        mySingleList.display();
        System.out.println();

        System.out.println("查找是否包含关键字 key 在单链表中:");
        System.out.println("查找关键字125:"+mySingleList.contains(125));
        System.out.println("查找关键字30:"+mySingleList.contains(30));
        System.out.println();

        System.out.println("删除第一次出现的关键字为 key 的节点:");
        System.out.println("删除头节点50:");
        mySingleList.remove(50); //删除头节点
        mySingleList.display();
        System.out.println("删除中间节点30:");
        mySingleList.remove(30); // 删除中间节点
        mySingleList.display();
        System.out.println("删除尾节点200:");
        mySingleList.remove(200); // 删除尾节点
        mySingleList.display();
        System.out.println();

        System.out.println("删除第一次出现的关键字为 key 的节点:");
        mySingleList.addFirst(20);
        mySingleList.display();
        mySingleList.removeAllKey(20);
        mySingleList.display();
        System.out.println();

        System.out.print("单链表的长度:");
        System.out.println(mySingleList.getLength());
        System.out.println();

        // 测试内存泄漏
        try {
            Thread.sleep(1000);
            System.out.println("睡醒了");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

4. 测试结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Java实现单链表的操作

本文链接: https://www.lsjlt.com/news/163184.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现单链表的操作
    本文实例为大家分享了Java实现单链表的基本操作,供大家参考,具体内容如下 顺序表:物理上逻辑上都连续;链表:物理上不一定连续,逻辑上一定连续的。 链表的概念及结构 概念:连表示一种...
    99+
    2024-04-02
  • Java实现单链表基础操作
    关于链表 链表是有序的列表链表是以节点的方式来存储每个节点包含data域,next域(指向下一个节点)分带头节点的链表和没有头节点的链表 定义一个节点: package linke...
    99+
    2024-04-02
  • Java实现单链表增删改查的操作方法
    这篇文章主要介绍了Java实现单链表增删改查的操作方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、新建学生节点类Stu_Node节点包含:学号:int num;姓名:S...
    99+
    2023-06-14
  • C语言如何实现单链表操作
    本篇内容介绍了“C语言如何实现单链表操作”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 链表的概念及结构概念:链表是一种物理存储结构上非连...
    99+
    2023-06-29
  • Java实现无头双向链表操作
    本文实例为大家分享了Java实现无头双向链表的具体代码,供大家参考,具体内容如下 无头双向链表的结构: 代码分析 节点结构 class Node {     private int...
    99+
    2024-04-02
  • C语言实现单链表的基本操作分享
    目录导语单链表单链表的特点定义初始化操作头插法尾插法删除第i个元素在第i个位置插入导语 无论是顺序存储结构还是链式存储结构,在内存中进行存放元素的时候,不仅需要存放该元素的相关信息,...
    99+
    2022-11-13
    C语言单链表基本操作 C语言单链表
  • Java双向链表的操作
    目录前言一、认识双向链表二、双向链表的增删改查1.插入头插尾插在index位置插入2.修改3.查询4.删除删除index位置的节点头删尾删删除第一个值为val的节点删除所有值为val...
    99+
    2024-04-02
  • ​​​​​​​C语言实现单链表基本操作方法
    目录存储结构基本功能头插法创建单链表尾插法创建单链表获取指定位置的元素在指定位置插入元素删除指定位置的元素获取单链表的长度合并两个非递减的单链表晴链表遍历打印单链表附上完整代码存储结...
    99+
    2024-04-02
  • Java如何实现无头双向链表操作
    这篇文章主要介绍了Java如何实现无头双向链表操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下无头双向链表的结构:代码分析节点结构class Node...
    99+
    2023-06-28
  • js的链表操作实例
    这篇文章主要讲解了“js的链表操作实例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“js的链表操作实例”吧!如下所示:<!doctype h...
    99+
    2024-04-02
  • java实现单链表linked list的方法
    这篇“java实现单链表linked list的方法”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“java实现单链表linked list的方法”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望...
    99+
    2023-06-06
  • java实现单链表中的增删改
    本文实例为大家分享了java实现单链表中增删改的具体代码,供大家参考,具体内容如下 什么是链表 链表是有序的列表,但是它在内存中是存储如下 小结: 链表是以节点的方式来存储,是链式...
    99+
    2024-04-02
  • java实现单链表倒转的方法
    java中有关单链表反转的方法有很多种,这里记录一种并附上详细步骤: 代码如下 public class Solution {     public ListNode revers...
    99+
    2024-04-02
  • java数据结构单向链表的操作有哪些
    本文小编为大家详细介绍“java数据结构单向链表的操作有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“java数据结构单向链表的操作有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。关于节点数据添加:尾添...
    99+
    2023-07-06
  • C++中怎么实现链表操作
    C++中怎么实现链表操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++链表操作代码示例:// linklist.cpp : 定义控制台应用程...
    99+
    2023-06-17
  • python单链表的实现
    ''' 当加入第一个node节点的时候,会有几个值,(这里的self.tail.next 其实就是node.next) head = item = tail = Node(object element1 memory) item = hea...
    99+
    2023-01-31
    链表 python
  • python 实现线性链表(单链表)
    初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码。 #!/usr/bin/python # -*- coding:utf-8 -*- # Author: Hui # Date: 2017-10-13...
    99+
    2023-01-31
    链表 线性 python
  • java怎么实现单链表反转
    要实现单链表的反转,可以使用迭代或递归两种方法。 迭代法: public ListNode reverseList(ListNo...
    99+
    2023-10-26
    java
  • C语言数据结构之单链表与双链表的增删改查操作实现
    目录前言单链表的增删改查定义结构体以及初始化增加结点删除结点查找修改结点移除结点最终效果双链表的基本操作初始化建表遍历双链表指定位置插入结点指定位置删除结点查找结点位置最终效果结语前...
    99+
    2024-04-02
  • JavaScript实现表单元素的操作
    目录一、forms[]; Form 表单对象1、属性2、方法3、事件二、表单元素1、输入标记2、输入类控件的type可选值3、elements[]; Element 表单元素对象4、...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作