赞
踩
1、定义一个人员节点类,每一个PersonNode对象就是一个节点
package com.rf.springboot01.dataStructure.singleLinkedList2; /** * @description: 定义一个人员节点类,每一个PersonNode对象就是一个节点 * @author: xiaozhi * @create: 2020-07-15 16:44 */ public class PersonNode { public int num;//编号 public String name;//名称 public String aliasName;//别名 public PersonNode next;//指向下一个节点 //构造器 public PersonNode(int num, String name, String aliasName) { this.num = num; this.name = name; this.aliasName = aliasName; } public PersonNode() { } //重写toString方法 @Override public String toString() { return "PersonNode{" + "num=" + num + ", name='" + name + '\'' + ", aliasName='" + aliasName + '\'' + '}'; } }
2、创建一个单链表管理人员节点
package com.rf.springboot01.dataStructure.singleLinkedList2; /** * @description: * @author: xiaozhi * @create: 2020-07-21 23:26 */ public class SingleLinkedList { //先初始化一个头结点,头节点位置固定,不存放任何数据,作用是表示链表的头节点 private PersonNode head; public SingleLinkedList(PersonNode head) { this.head = head; } public SingleLinkedList() { head = new PersonNode(); } //在链表的指定位置添加节点数据 public void addByNum(PersonNode personNode) { PersonNode temp = head; boolean flag = false;//插入的编号是否存在,默认不存在 while (true) { if (temp.next == null) {//已经在链表的尾部 break; } if (temp.next.num > personNode.num) {//找到位置,在temp后添加 break; } if (temp.next.num == personNode.num) {//编号已经存在,不能添加 flag = true; break; } temp = temp.next;//后移,遍历 } if (flag) { System.out.printf("添加的人员编号%d已经存在,不能添加\n", personNode.num); } else { //添加数据到链表中,temp后的位置 personNode.next = temp.next; temp.next = personNode; } } //显示链表 public void show() { //判断链表是否为空 if (head.next == null) { System.out.println("链表为空"); return; } //因为头节点不能动,所以需要一个临时变量来遍历 PersonNode temp = head.next; while (true) { //判断是否到链表最后 if (temp == null) { break; } //输出节点信息 System.out.println(temp); //将temp向后移动 temp = temp.next; } } /** * @Description: 合并两个单链表,合并之后的链表依然有序 * @Param: head1 head2 * @Author: xz * @return: PersonNode * @Date: 2020/7/21 15:50 */ public static SingleLinkedList mergeLinkedList(SingleLinkedList list1, SingleLinkedList list2) { // 判断需要合并的链表是否为空 if (list1.head.next == null && list2.head.next == null) { throw new RuntimeException("需要合并的两条链表都为空!"); } // 一条链表为空,直接返回另一条链表 if (list1.head.next == null) { System.out.println(list2); } if (list2.head.next == null) { System.out.println(list1); } //定义合并之后的新链表的头节点 PersonNode newHead = new PersonNode(); PersonNode current = newHead; // 定义一个current结点指向新链表 //定义临时变量 PersonNode temp1 = list1.head.next; PersonNode temp2 = list2.head.next; while (temp1 != null && temp2 != null) { if (temp1.num < temp2.num) { current.next = temp1; // 新链表中,current指针的下一个结点对应较小的那个数据 temp1 = temp1.next;//temp1指针后移 current = current.next; // current指针后移 } else { current.next = temp2; temp2 = temp2.next; current = current.next; } } // 合并剩余的元素 if (temp1 == null) { // 说明链表1遍历完了,是空的 current.next = temp2; } if (temp2 == null) { // 说明链表2遍历完了,是空的 current.next = temp1; } return new SingleLinkedList(newHead); } }
3、定义一个测试类
package com.rf.springboot01.dataStructure.singleLinkedList2; /** * @description: * @author: xiaozhi * @create: 2020-07-21 23:28 */ public class SingleLinkedListTest { public static void main(String[] args) { //创建节点 PersonNode personNode1 = new PersonNode(1, "张三", "小张"); PersonNode personNode2 = new PersonNode(2, "李四", "小李"); PersonNode personNode3 = new PersonNode(3, "王五", "小王"); PersonNode personNode4 = new PersonNode(4, "赵二", "小赵"); //添加链表节点 SingleLinkedList list1 = new SingleLinkedList(); list1.addByNum(personNode1); list1.addByNum(personNode4); System.out.println("添加的第一个链表节点数据如下:============"); //查询链表所有节点 list1.show(); //添加链表节点 SingleLinkedList list2 = new SingleLinkedList(); list2.addByNum(personNode2); list2.addByNum(personNode3); System.out.println("添加的第二个链表节点数据如下:============"); //查询链表所有节点 list2.show(); System.out.println("合并后的新链表的节点数据如下:============"); SingleLinkedList list= SingleLinkedList.mergeLinkedList(list1,list2); //查询合并后的链表所有节点 list.show(); } }
4、输出结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。