数据结构之单链表实现(JAVA语言+C语言)

一、理论

1 单链表结构

在这里插入图片描述

2 增、删、查 、改思路

  • (增)直接添加放到最后即可。按顺序添加:找到要修改的节点的前一个节点,插入新节点()。
  • (改)要修改的节点修改内容即可。
  • (删)找到待删除节点的前一个节点,把要删除节点的后一个节点信息存放到该节点的next即可
  • (查==较容易)遍历依次打印即可。按编号查找,找到对应编号打印即可

二、代码实现

1、JAVA代码实现

package basicdata;

public class SingleLinkedListTest {
    public static void main(String[] args) {
        Node node1 = new Node(123, "Tom", "无极剑道");
        //

        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.addNode(node1);
        singleLinkedList.list();
        System.out.println("*******************");
        singleLinkedList.addByOrder(new Node(234, "Jack", "断头斩杀"));
        singleLinkedList.addByOrder(new Node(121, "Jack", "断头斩杀"));
        singleLinkedList.addByOrder(new Node(121, "Jack", "断头斩杀"));
        singleLinkedList.list();
        //System.out.println("******修改后*******");
        //singleLinkedList.alter(new Node(121, "Bob", "无形之刃"));
        //singleLinkedList.list();
       // System.out.println("**************");
        //singleLinkedList.delNode(234);

        System.out.println("***反转后***");
        singleLinkedList.reverSetList();
        singleLinkedList.list();

    }
}
//
class SingleLinkedList{
    // 先初始化一个头结点,头节点不存放数据
    private Node head = new Node(0,"表头","领导单链表");

    // 返回表头
    public Node getHead(){
        return head;
    }

    public SingleLinkedList() {
    }

    // 添加节点到单链表,按添加顺序排列
    public void addNode(Node node){

        // 思路:把头结点的地址给temp
        //      直到next = null时,让next存放添加的节点

        Node temp = head;
        while (true){
            if (temp.next == null) {
                break;
            }
            else {
                temp = temp.next;

            }
        }
        // 退出while 循环时 temp.next = null
        temp.next  = node;
    }

    // 遍历单链表
    public void list(){
        Node temp = head;
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        while (true){
            if (temp == null) {
                break;
            }
            else {
                // 输出节点信息
                System.out.println(temp);
                // 指针后移
                temp = temp.next;
            }
        }
    }

    //  根据编号顺序插入节点 ,链表内容按编号从小到大排列
    public void addByOrder(Node node){
        // 需要先找到要添加位置的前一个节点

        // 链表为空不需要单独考虑
        Node temp = head;
        // 为找到插入位置 需要一个 flag
        boolean flag = false;
        while (true){
            // 此情况可以添加,添加到表头后
            if (temp.next == null) { // 到链表末端
                break;
            }
            // 此情况不可以添加,要添加的编号已经存在
            if (temp.next.number == node.number) {
                flag = true;
                break;
            }
            //此情况为找到要添加位置的前一个节点,可以添加
            if (temp.next.number > node.number) {
                break;
            }
            else {
                temp = temp.next;
            }
        }

        if (flag ) {
            System.out.printf("你要插入的节编号%d已经存在",node.number);
            System.out.println();
        }
        else {
            node.next = temp.next ;
            temp.next=node;
        }
    }
    // 修改节点信息(根据编号),编号不变,修改内容
    public void alter(Node node){
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }

        // 和按编号插入(Node temp = head;)稍微有点区别
        // Node temp  = head.next;
        Node temp  = head.next;
        boolean flag = false;
         while (true){
             if (temp == null) {
                 break;
             }
             // 找到要修改的节点,可以修改
             if (temp.number == node.number) {
                 flag = true;
                 break;
             }
             else {
                 temp = temp.next;
             }
         }
        if (flag) {
            // 修改
            temp.name = node.name;
            temp.skill= node.skill;
        }
        else {
            System.out.println("没有找到要修改的节点");
        }

    }
    // 根据编号删除节点
    public void delNode(int number){
        //需要找到待删除的前一个节点
        Node temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null) {
                break;
            }
            //找到待删除的前一个节点
            if (temp.next.number == number) {
                flag = true;
                break;
            }
            else {
                temp  =  temp.next;
            }

        }
        if (flag ) {
            //
            temp.next = temp.next.next;
        }
        else {
            System.out.println("要删除的元素不存在");
        }
    }

    // 反转单链表
    public void reverSetList(){
        if (this.head.next== null||this.head.next.next==null) {
            return;
        }

        Node tempCur = this.head.next; // 辅助变量
        Node tempNext = null;      // 指向tempCur,不然会丢失
        Node reverSetHead = new Node(0, "", ""); // 新链表
        while (tempCur != null){
            tempNext = tempCur.next; //存储当前节点的下一节点
            tempCur.next = reverSetHead.next;// 头插法 把当前节点接到到reverSetHead
            reverSetHead.next = tempNext;
            tempCur=tempNext;// 后移
        }
        this.head.next = reverSetHead.next;
    }

}
// 定义Node
class Node{
    public int number;
    public String name;
    public String skill;
    public Node next;    //存放下一个节点地址
//构造器
    public Node(int number, String name, String skill) {
        this.number = number;
        this.name = name;
        this.skill = skill;

        //this.next = next;
        // 理解:不给next赋值
        //没申请一个节点时 next = null
    }
    //重写 toString
    @Override
    public String toString() {
        return "Node{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

运行结果

Node{number=0, name='表头', skill='领导单链表'}
Node{number=123, name='Tom', skill='无极剑道'}
*******************
你要插入的节编号121已经存在
Node{number=0, name='表头', skill='领导单链表'}
Node{number=121, name='Jack', skill='断头斩杀'}
Node{number=123, name='Tom', skill='无极剑道'}
Node{number=234, name='Jack', skill='断头斩杀'}
******修改后*******
Node{number=0, name='表头', skill='领导单链表'}
Node{number=121, name='Bob', skill='无形之刃'}
Node{number=123, name='Tom', skill='无极剑道'}
Node{number=234, name='Jack', skill='断头斩杀'}
删除后**************
Node{number=0, name='表头', skill='领导单链表'}
Node{number=121, name='Bob', skill='无形之刃'}
Node{number=123, name='Tom', skill='无极剑道'}

2、C语言代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504440.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32+ MAX30102通过指尖测量心率+血氧饱和度

一、前言 重要的事情放在最前面:max30102只适用于指尖手指测量,不适用与手腕手指测量,如需做成可穿戴样式选择传感器的小伙伴请pass掉他,因为他只有红光和红外2种光,不够充足的数据源去运算。 由于一些原因&#xff0c…

阿基米德分牛问题及其Python求解

文章目录 题目大意sympy求解结果 题目大意 问 太阳神有一牛群,由白、黑、花、棕四种颜色的公、母牛组成,其间关系如下,求每种牛的个数。 公牛中,白牛多于棕牛,二者之差为黑牛的 1 2 1 3 \frac{1}{2}\frac{1}{3} 21​…

排序——交换排序(冒泡排序与快速排序)

本专栏和大家分享关于排序的算法,其中有插入排(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排)、交换排序(冒泡排序和快速排序)、归并排序以及其他非基于比较的排序 本文与大家分享交换排序 目录 …

SAP FICO 银企直联

银企直联是指企业通过互联网或专线连接的方式,使企业的SAP系统与商业银行的业务系统通过特定的数据接口实现连接,在SAP系统中可以直接查询银行账户的余额和明细,实现付款、银企对账、自动出具余额调节表等功能。 在这主要介绍SAP相关CALLSS配…

C++—vector的介绍及使用 vector的模拟实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

Python绘制线图之plt.plot()的介绍以及使用

在Python中plt.plot是matplotlib库中的一个函数,用于绘制点和线,并对其样式进行控制,下面这篇文章主要给大家介绍了关于Python绘制线图之plt.plot()的介绍以及使用的相关资料,需要的朋友可以参考下 plt.plot() 是Matplotlib库中用于绘制线图(折线图)的主…

【递归】有序分数(SBT)

给定一个整数 N,请你求出所有分母小于或等于 N,大小在 [0,1][0,1] 范围内的最简分数,并按从小到大顺序依次输出。 例如,当 N5时,所有满足条件的分数按顺序依次为: 0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4…

Python | Leetcode Python题解之第1题两数之和

题目: 题解: class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:n len(nums)for i in range(n):for j in range(i 1, n):if nums[i] nums[j] target:return [i, j]return []

GT收发器PHY层设计(4)上板验证

文章目录 前言一、实验平台二、通道1收发数据三、通道2收发数据 前言 在前面三篇内容当中详细介绍了基于GT的PHY设计,本篇内容进行上板测试,主要查看接收数据是否能正确对齐 一、实验平台 俩个光口相互通信,即1发2收,2发1收 发…

C++要学到什么程度才能找到实习?

在考虑 C 学习到何种程度可以找到实习时,以下是一些具体的方向和建议。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我…

Win11 家庭版/专业版开启Hyper-V

​ 目录 收起 一、安装Hyper-V 二、启用Hyper-V Hyper-V是Windows专业版专属功能,但大多数(除商业本)品牌机内置的Windows都是家庭版。只能通过命令开启,方法如下: Windows专业版请直接阅读启用Hyper-V部分 一、安装Hy…

云服务器4核8G配置优惠价格表,买一年送3个月,12M公网带宽

腾讯云轻量4核8G12M服务器优惠价格646元15个月,买一年送3个月,配置为轻量4核8G12M、180GB SSD盘、2000GB月流量、12M带宽,腾讯云优惠活动页面 yunfuwuqiba.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器租用价格 腾讯云&…

中间件安全(apache、tomcat)

靶场: vulfocus Apache Apache HTTP Server 是美国阿帕奇( Apache )基金会的一款开源网页服务器。该服务器具有快速、可靠且可通过简单的API进行扩充的特点,发现 Apache HTTP Server 2.4.50 中针对 CVE - 2021 - 41773 的修复…

【c++】类和对象(六)深入了解隐式类型转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来到初始化列表,隐式类型转换以及explicit的内容 目录 1.初始化列表1.1构造函数体赋值1.2初始化列表1.2.1隐式类型转换与复制初始化 1.3e…

R2GenCMN中的Encoder_Decoder结构

R2GenCMN中的 Encoder_Decoder 结构 Encoder_Decoder 结构直接关系到文本的生成,它结构参考的transformer的结构 我们这里主要看代码的实现,从视觉编码器的输出开始 1. 模型结构 首先介绍一下整体结构,这里的baseCMN其实就是一个包装了的T…

Learning from Multiple Annotator Noisy Labels via Sample-wise Label Fusion

confusion matrix P n ( r ) _n^{(r)} n(r)​ pillow8.3.1和python3.7.11的环境不好满足,不建议复现

前端学习<二>CSS基础——12-CSS3属性详解:动画详解

前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation 过渡:transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡…

LeetCode226:反转二叉树

题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 解题思想 使用前序遍历和后序遍历比较方便 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) return root;swap(root->left, root…

查生意在SFE连锁加盟展会展示口碑力量,助力创业者精准抉择

在这个信息爆炸的时代,对于广大创业者而言,选择正确的连锁加盟项目犹如在繁星中寻找璀璨北斗。为了更好地服务于这个需求日益增长的市场,查生意一站式连锁经营口碑评分查询服务平台应运而生,并已在上海连锁加盟展会(SF…

<PaddlePaddle学习使用P1>——《PaddlePaddle教程》

一、PaddlePaddle概述 1.什么是PaddlePaddle PaddlePaddle官网地址链接:https://www.paddlepaddle.org.cn/ 为什么学习PaddlePaddle: 2.PaddlePaddle特点 PaddlePaddle优点(目前): PaddlePaddle缺点(目…