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 ...
随机推荐
- spket插件安装并设置JQuery自动提示(转)
spket是一个开发JavaScript.jQuery.Ext_js等的开发工具,它可以 是独立的IDE,也可以作为Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件: 1.首 ...
- 四 sys模块
1 sys.argv 命令行参数List,第一个元素是程序本身路径 2 sys.exit(n) 退出程序,正常退出时exit(0) 3 sys.version 获取Python解释程序的版本信息 4 ...
- python中的命名元组namedtuple
namedtuple是继承自tuple的子类.namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性 可利用collections.namedtuple构建一个简单的类. fro ...
- Websocket实现群聊、单聊
Websocket 使用的第三方模块:gevent-websocket 群聊 ws群聊.py中的内容 from flask import Flask, request, render_template ...
- Date 时间 日期 常用方法函数
转载自https://www.cnblogs.com/lcngu/p/5154834.html 一.java.util.Date对象用来表示时间,基本方法如下: Date mDate = new Da ...
- oracle数据库新建库
1.https://jingyan.baidu.com/article/76a7e409f3f37bfc3b6e15de.html 利用工具新建库. 2.创建时报错 out of memory 调节s ...
- js常用的数组,,字符串,,Math..正则方法
数组 slice[start,end] 返回从原数组中指定开始下标到结束下标之间的项目组成新数组(不会影响原数组) splice() 1.删除功能:2个参数 , 起始位置 , 删除的项目 2.插入功能 ...
- C++中的字符数组与字符指针
//[C++基础]字符数组和字符指针.cpp//剑指offer上的这段话://为了节省内存,c/c++把常量字符串放到单独的一个内存空间.但是当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的 ...
- HttpClient上传文件
1.上传客户端代码: public static void upload() { CloseableHttpClient httpclient = HttpClients.createDefault( ...
- DataInputStream FileInputStream 区别
DataInputStream是数据输入流,读取的是java的基本数据类型. FileInputStream是从文件系统中,读取的单位是字节. FileReader 是从文件中,读取的单位是字符