【书籍】Java常用算法手册-链表结构

本文介绍了一个使用Java实现的简单链表操作示例,包括添加、查找、插入和删除结点等功能,并通过具体示例展示了如何使用这些功能。
问题:input为什么会被跳转?



解决方案:重新new 一个Scanner。

import java.util.Scanner;

//链表数据元素的类
class DATA2
{
    String key;          //结点的关键字
    String name;
    int age;
}                        //数据结点类型

//链表的类
class CLType            //定义链表结构
{
    DATA2 nodeData = new DATA2();
    CLType nextNode;
    
    CLType CLAddEnd(CLType head, DATA2 nodeData)       //追加结点
    {
        CLType node, htemp;
        if((node = new CLType()) == null)
        {
            System.out.print("申请内存失败!\n");
            return null;                             //分配内存失败
        }
        else
        {
            node.nodeData = nodeData;                //保存数据
            node.nextNode = null;                   //设置结点引用为空,即为表尾
            if(head == null)                         //头引用
            {
                head = node;
                return head;
            }
            htemp = head;
            while(htemp.nextNode != null)          //查找链表的末尾
            {
                htemp = htemp.nextNode;
            }
            htemp.nextNode = node;
            return head;
        }
    }

    CLType CLAddFirst(CLType head, DATA2 nodeData)
    {
        CLType node;
        if((node = new CLType()) == null)
        {
            System.out.print("申请内存失败!\n");
            return null;
        }
        else
        {
            node.nodeData = nodeData;
            node.nextNode = head;
            head = node;
            return  head;
        }
    }

    CLType CLFindNode(CLType head, String key)                  //查找结点
    {
        CLType htemp;
        htemp = head;                         //保存链表头引用
        while(htemp != null)                //若结点有效,则进行查找
        {
            if(htemp.nodeData.key.compareTo(key) == 0)  //若结点关键字与传入关键字相同
            {
                return htemp;                //返回该结点引用
            }
            htemp = htemp.nextNode;         //处理下一结点
        }
        return null;
    }

    CLType CLInsertNode(CLType head, String findkey, DATA2 nodeData)  //插入结点
    {
        CLType node, nodetemp;
        if((node = new CLType()) == null)         //分配内存失败
        {
            System.out.print("申请内存失败!\n");
            return null;
        }
        node.nodeData = nodeData;                //保存结点中的数据
        nodetemp = CLFindNode(head, findkey);
        if(nodetemp != null)
        {
            node.nextNode = nodetemp.nextNode;    //新插入结点指向关键结点的下一结点
            nodetemp.nextNode = node;              //设置关键结点指向新插入结点
        }
        else
        {
            System.out.print("未找到正确的插入位置!\n");
        }
        return head;
    }

    int CLDeleteNode(CLType head, String key)
    {
        CLType node, htemp;                  //node保存删除结点的前一结点
        htemp = head;
        node = head;
        while(htemp != null)
        {
            if(htemp.nodeData.key.compareTo(key) == 0)  //找到关键字,执行删除操作
            {
                node.nextNode = htemp.nextNode;       //使前一结点指向当前结点的下一结点
                htemp = null;                           //释放内存
                return 1;
            }
            else
            {
                node = htemp;                            //指向当前结点
                htemp = htemp.nextNode;                 //指向下一结点
            }
        }
        return 0;
    }

    int CLLength(CLType head)                  //计算链表长度
    {
        CLType htemp;
        int Len = 0;
        htemp = head;
        while (htemp != null)                //遍历整个链表
        {
            Len++;                            //累加结点数量
            htemp = htemp.nextNode;         //处理下一结点
        }
        return Len;                        //返回结点数量
    }

    void CLAllNode(CLType head)               //遍历链表
    {
        CLType htemp;
        DATA2 nodeData;
        htemp = head;
        System.out.printf("当前链表共有%d个结点。链表所有数据如下:\n", CLLength(head));
        while (htemp != null)
        {
            nodeData = htemp.nodeData;         //获取结点数据
            System.out.printf("结点(%s,%s,%d)\n", nodeData.key, nodeData.name, nodeData.age);
            htemp = htemp.nextNode;           //处理下一结点
        }
    }

}

/**
 * P2_2 class
 *
 * @author wcy
 * @date 2017/10/19.
 */
public class P2_2 {

    public static void main(String[] args) {
        CLType node, head = null;
        CLType CL = new CLType();
        String key, findKey;
        Scanner input = new Scanner(System.in);

        System.out.print("链表测试。先输入链表中的数据,格式为:关键字 姓名 年龄\n");
        do {
            DATA2 nodeData = new DATA2();
            nodeData.key = input.next();
            if(nodeData.key.equals("0"))
            {
                break;                        //若输入0,则退出
            }
            else
            {
                nodeData.name = input.next();
                nodeData.age = input.nextInt();
                head = CL.CLAddEnd(head, nodeData); //在链表尾部添加结点
            }
        }while(true);
        CL.CLAllNode(head);         //显示所有结点

        input = new Scanner(System.in);
        System.out.print("\n演示插入结点,输入插入位置的关键字:");
        findKey = input.next();                 //输入插入位置关键字

        System.out.print("输入插入结点的数据(关键字 姓名 年龄):");
        DATA2 nodeData = new DATA2();
        nodeData.key = input.next();
        nodeData.name = input.next();
        nodeData.age = input.nextInt(); //输入插入结点数理
        head = CL.CLInsertNode(head, findKey, nodeData);    //调用插入函数
        CL.CLAllNode(head);               //显示所有结点

        System.out.print("\n演示删除结点,输入要删除的关键字:");
        key = input.next();             //输入删除结点关键字
        CL.CLDeleteNode(head, key);     //调用删除结点函数
        CL.CLAllNode(head);             //显示所有结点

        System.out.print("\n演示在链表中查找,输入查找关键字:");
        key = input.next();             //输入查找关键字
        node = CL.CLFindNode(head, key);  //调用查找函数,返回结点引用
        if(node != null)
        {
            nodeData = node.nodeData;     //获取结点的数据
            System.out.printf("关键字%s对应的结点为(%s,%s,%d)\n", key, nodeData.key, nodeData.name, nodeData.age);
        }
        else                              //若结点引用无效
        {
            System.out.printf("在链表中未找到关键字为%s的结点!\n", key);
        }
    }
}


Intellij工具,JDK1.8 运行结果如下:

链表测试。先输入链表中的数据,格式为:关键字 姓名 年龄
1 张三 33
2 五五 55
0 0 0
当前链表共有2个结点。链表所有数据如下:
结点(1,张三,33)
结点(2,五五,55)


演示插入结点,输入插入位置的关键字:1
输入插入结点的数据(关键字 姓名 年龄):3 李四 44
当前链表共有3个结点。链表所有数据如下:
结点(1,张三,33)
结点(3,李四,44)
结点(2,五五,55)


演示删除结点,输入要删除的关键字:3
当前链表共有2个结点。链表所有数据如下:
结点(1,张三,33)
结点(2,五五,55)


演示在链表中查找,输入查找关键字:2
关键字2对应的结点为(2,五五,55)

算法基础篇 **章 算法和实现算法Java语法 1.1 建立算法初步概念 1.1.1 什么是算法 1.1.2 算法的发展历史 1.1.3 算法的分类 1.2 算法相关概念的区别 1.2.1 算法与公式的关系 1.2.2 算法与程序的关系 1.2.3 算法与数据结构的关系 1.3 算法的表示 1.3.1 自然语言表示 1.3.2 流程图表示 1.3.3 N-S图表示 1.3.4 伪代码表示 1.4 算法的性能评价 1.4.1 时间复杂度 1.4.2 空间复杂度 1.5 一个算法实例 1.5.1 查找数字 1.5.2 创建项目 1.5.3 编译执行 1.6 Java程序的基本结构 1.6.1 类是一个基本单元 1.6.2 main方法 1.6.3 自定义方法 1.6.4 System.out.println的使用 1.6.5 一个简单而完整的程序 1.7 顺序结构 1.8 分支结构 1.8.1 if...else分支结构 1.8.2 if...else嵌套 1.8.3 switch语句 1.8.4 编程实例 1.9 循环结构 1.9.1 while循环 1.9.2 do…while循环 1.9.3 for循环 1.9.4 编程实例 1.10 跳转结构 1 1.10.3 编程实例 1.11 小结 第2章 数据结构 2.1 数据结构概述 2.1.1 什么是数据结构 2.1.2 数据结构中的基本概念 2.1.3 数据结构的内容 2.1.4 数据结构的分类 2.1.5 数据结构的几种存储方式 2.1.6 数据类型 2.1.7 常用的数据结构 2.1.8 选择合适的数据结构解决实际问题 2.2 线性表 2.2.1 什么是线性表 2.2.2 线性表的基本运算 2.3 顺序表结构 2.3.1 准备数据 2.3.2 初始化顺序表 2.3.3 计算顺序表长度 2.3.4 插入结点 2.3.5 追加结点 2.3.6 删除结点 2.3.7 查找结点 2.3.8 显示所有结点 2.3.9 顺序表操作实例 2.4 链表结构 2.4.1 什么是链表结构 2.4.2 准备数据 2.4.3 追加结点 2.4.4 插入头结点 2.4.5 查找结点 2.4.6 插入结点 2.4.7 删除结点 2.4.8 计算链表长度 2.4.9 显示所有结点 2.4.10 链表操作实例 2.5 栈结构 2.5.1 什么是栈结构 2.5.2 准备数据 2.5.3 初始化栈结构 2.5.4 判断空栈 2.5.5 判断满栈 2.5.6 清空栈 2.5.7 释放空间 2.5.8 入栈 2.5.9 出栈 2.5.10 读结点数据 2.5.11 栈结构操作实例 2.6 队列结构 2.6.1 什么是队列结构 2.6.2 准备数据 2.6.3 初始化队列结构 2.6.4 判断空队列 2.6.5 判断满队列 2.6.6 清空队列 2.6.7 释放空间 2.6.8 入队列 2.6.9 出队列 2.6.10 读结点数据 2.6.11 计算队列长度 2.6.12 队列结构操作实例 2.7 树结构 2.7.1 什么是树结构 2.7.2 树的基本概念 2.7.3 二叉树 2.7.4 准备数据 2.7.5 初始化二叉树 2.7.6 添加结点 2.7.7 查找结点 2.7.8 获取左子树 2.7.9 获取右子树 2.7.10 判断空树 2.7.11 计算二叉树深度 2.7.12 清空二叉树 2.7.13 显示结点数据 2.7.14 遍历二叉树 2.7.15 树结构操作实例 2.8 图结构 2.8.1 什么是图结构 2.8.2 图的基本概念 2.8.3 准备数据 2.8.4 创建图 2.8.5 清空图 2.8.6 显示图 2.8.7 遍历图 2.8.8 图结构操作实例 2.9 小结 第3章 基本算法思想 3.1 常用算法思想概述 3.2 穷举算法思想 3.2.1 穷举算法基本思想 3.2.2 穷举算法实例 3.3 递推算法思想 3.3.1 递推算法基本思想 3.3.2 递推算法实例 3.4 递归算法思想 …… 第2篇 算法应用篇 第4章 排序算法 第5章 查找算法 第6章 基本数学问题 第7章 数据结构问题 第8章 数论问题 第9章 算法经典趣题 **0章 游戏中的算法 **1章 密码学概述 **2章 压缩与解压缩算法 第3篇 算法面试篇 **3章 数学能力测试 **4章 算法面试题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值