java链表实现
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");
// free(node); //释放内存
}
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; // 使前一结点指向当前结点的下一结点
// free(htemp); //释放内存
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; // 处理下一结点
}
}
}
public class LinkedList {
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); // 显示所有结点
System.out.printf("\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.printf("\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);
}
}
}
java链表实现的更多相关文章
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- Java链表基本操作和Java.util.ArrayList
Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...
- JAVA链表中迭代器的实现
注:本文代码出自<java数据结构和算法>一书. PS:本文中类的名字定义存在问题,Link9应改为Link.LinkList9应该为LinkList.由于在同包下存在该名称,所以在后面接 ...
- JAVA 链表操作:单链表和双链表
主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...
- java 链表数据结构
首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了.下面直接进入正题: 先要定义一个结点类 ...
- Java 链表
按链表的组织形式分有ArrayList和LinkList两种.ArrayList内部其实是用数组的形式实现链表,比较适合链表大小确定或较少对链表进行增删操作的情况,同时对每个链表节点的访问时间都是co ...
- 算法_栈与队列的Java链表实现
链表是一个递归的数据结构,它或者为null,或者是指向一个结点的引用,该结点含有一个泛型的元素和指向另一个链表的引用.可以用一个内部类来定义节点的抽象数据类型: private class Node ...
- 学习记录 java 链表知识
01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. ...
- Java链表的一些操作:
[还有一些其他的算法提]http://blog.csdn.net/WalkingInTheWind/article/category/906980 [转]http://blog.csdn.net/lu ...
- 面试中的Java链表
链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...
随机推荐
- 解题1(Suduku)
题目描述 问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏.玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行.每一列.每一个粗线宫内的数字均含1-9,并且不重复. ...
- django admin后台设置
#encoding:utf-8 from django.contrib import admin from son10.models import * # Register your models h ...
- 【翻译】 View Frustum Culling --1 View Frustum’s Shape
这是一些列来自lighthouse3d的视锥体裁剪教程.旨在学习总结,及便于查阅. 1.视锥体的形状 在OpenGL中,透视投影是由两个函数定义的gluPerspective和gluLookAt.我们 ...
- pyinstaller linux系统下打包python源文件
将python程序放在其他linux服务器中执行,通常linux服务器中默认安装python2.6,很多情况下需要升级为2.7 且要安装程序中需要的第三方模块,配置较为麻烦,所以通过在本地linux ...
- Oracle怎么修改字段类型
转载:https://www.2cto.com/database/201710/689523.html 有一个表名为tb,字段段名为name,数据类型nchar(20). 1.假设字段数据为空,则不管 ...
- SQL Server 2008 R2官方中文版下载
SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本. 在现今数据的世界里,公司要获得成功和不断发展,他们 ...
- java面试题:Linux
Q:Linux怎么查端口?端口被占用怎么办? netstat -ntulp | grep 2181//查看2181端口号 netstat -pan | grep 2181 //查看2181端口号 如下 ...
- c++ 面试题(汇总)
1,extern 关键字作用: http://www.cnblogs.com/lzjsky/archive/2010/11/24/1886686.html 2,static 关键字作用: https: ...
- Math.random控制随机数范围
let minNum= parseInt(Math.random()*7) + 1 let maxNum= parseInt(Math.random()*83) + 1 生成7~83的随机整数
- pthreads v3下的worker和pool的使用
有些人会想,明明用thread已经可以很好的工作了,为什么还要搞个worker和pool? 之所以要用到worker和pool还是因为效率,因为系统创建一个新线程代价是比较昂贵,每个创建的线程会复制当 ...