package com.ssm.cts.test;
/**
* CopyRright (c)2018-2028: chanpinxue.cn
* Project: cts
* Module Name: SLTest
* Comments: 单向链表
* JDK version used: JDK1.8
* Author: jzh
* Create Date: 2018-12-04
* Modified By: jzh
* Modified Date: 2018-12-04
* Why & What is modified:
* Version: <1.0>
*/
// 定义节点结构
class NodeData {
String key; // 结点的关键字
String name;
int age;
}
// 定义链表结构
class SLNode {
NodeData nodeData = new NodeData();
SLNode nextNode;
// 追加结点
@SuppressWarnings({ "null", "unused" })
SLNode addEnd(SLNode head, NodeData nodeData) {
SLNode temp;
SLNode node = new SLNode();
node.nodeData = nodeData; // 保存数据
node.nextNode = null; // 设置结点指针为空,即为表尾
// 头指针
if (head == null) {
head = node;
return head;
}
temp = head;
// 查找链表的末尾
while (temp.nextNode != null) {
temp = temp.nextNode;
}
temp.nextNode = node;
return head;
}
@SuppressWarnings({ "null", "unused" })
SLNode addFirst(SLNode head, NodeData nodeData) {
SLNode node = new SLNode();
node.nodeData = nodeData; // 保存数据
node.nextNode = head; // 指向头指针所指结点
head = node; // 头指针指向新增结点
return head;
}
// 查找结点
SLNode findNode(SLNode head, String key) {
SLNode temp;
temp = head; // 保存链表头指针
// 若结点有效,则进行查找
while (temp != null) {
// 若结点关键字与传入关键字相同
if (temp.nodeData.key.compareTo(key) == 0) {
return temp; // 返回该结点指针
}
temp = temp.nextNode; // 处理下一结点
}
return null; // 返回空指针
}
// 插入结点
@SuppressWarnings({ "null", "unused" })
SLNode insertNode(SLNode head, String findkey, NodeData nodeData) {
SLNode node, temp;
node = new SLNode();
node.nodeData = nodeData; // 保存结点中的数据
temp = findNode(head, findkey);
// 若找到要插入的结点
if (temp != null) {
node.nextNode = temp.nextNode; // 新插入结点指向关键结点的下一结点
temp.nextNode = node; // 设置关键结点指向新插入结点
} else {
System.out.print("未找到正确的插入位置!\n"); // 释放内存
}
return head; // 返回头指针
}
int deleteNode(SLNode head, String key) {
SLNode node, temp; // node保存删除结点的前一结点
temp = head;
node = head;
while (temp != null) {
// 找到关键字,执行删除操作
if (temp.nodeData.key.compareTo(key) == 0) {
node.nextNode = temp.nextNode; // 使前一结点指向当前结点的下一结点
return 1;
} else {
node = temp; // 指向当前结点
temp = temp.nextNode; // 指向下一结点
}
}
return 0; // 未删除
}
// 计算链表长度
int getLength(SLNode head) {
SLNode temp;
int Len = 0;
temp = head;
// 遍历整个链表
while (temp != null) {
Len++; // 累加结点数量
temp = temp.nextNode; // 处理下一结点
}
return Len; // 返回结点数量
}
// 遍历链表
void getAllNode(SLNode head) {
SLNode temp;
NodeData nodeData;
temp = head;
System.out.printf("当前链表共有%d个结点。链表所有数据如下:\n", getLength(head));
// 循环处理链表每个结点
while (temp != null) {
nodeData = temp.nodeData; // 获取结点数据
System.out.printf("结点(%s,%s,%d)\n", nodeData.key, nodeData.name, nodeData.age);
temp = temp.nextNode; // 处理下一结点
}
}
}
public class SLTest {
// 测试
public static void main(String[] args) {
SLNode node, head = null;
SLNode sl = new SLNode();
for (int i = 0; i <= 5; i++) {
NodeData nodeData = new NodeData();
nodeData.key = String.valueOf(i);
nodeData.name = "jzh" + String.valueOf(i);
nodeData.age = 20 + i;
head = sl.addEnd(head, nodeData); // 在链表尾部添加结点
}
sl.getAllNode(head); // 显示所有结点
NodeData nodeData = new NodeData();
nodeData.key = "99";
nodeData.name = "chanpinxue.cn";
nodeData.age = 10; // 输入插入结点数据
head = sl.insertNode(head, "2", nodeData); // 调用插入函数
sl.getAllNode(head); // 显示所有结点
sl.deleteNode(head, "3"); // 调用删除结点函数
node = sl.findNode(head, "4"); // 调用查找函数,返回结点指针
// 若返回结点指针有效
if (node != null) {
nodeData = node.nodeData; // 获取结点的数据
System.out.printf("关键字4的结点信息为(%s,%s,%d)\n", nodeData.key, nodeData.name, nodeData.age);
}
}
}