关于Java算法与数据结构-单向链表

关于Java算法与数据结构-单向链表

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

  }

}

 

发表回复

您的电子邮箱地址不会被公开。