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); } } }