链表的介绍
链表是以节点的方式来存储,既链式存储每个节点包含 data 域:存放数据, next 域:指向下一个节点链表分为单链表和双链表 使用java模拟单链表的增删改查: package com.sai.linkedList; /** * @Author sai * @Description 单链表的添加和查看 * @Time 2020-07-01 10:16 */ public class SingleLinkedList_CRUD { static class SingleLinkedList{ //创建头节点 private HeadNode head = new HeadNode(0,"",""); /** * 添加链表_无序 * @param headNode * 1.找到最后的节点 * 2.将最后的next指向下一个节点 */ public void add(HeadNode headNode){ //创建头结点 HeadNode temp = head; //遍历节点,找到最后 while (true){ if(temp.next == null){ break; } temp = temp.next; } //指向下一个节点 temp.next = headNode; } /** * 添加链表_有序 * @param headNode * 1.找到位置 * 2.设置位置前一个个节点的指针指向,和添加数据的指针方向 */ public void addByOrder(HeadNode headNode){ HeadNode temp = head; Boolean q = false; while (true){ if(temp.next == null){ //队列尾部 break; } if(temp.next.no > headNode.no){ //找到真确的位置 break; } else if(temp.next.no == headNode.no){ //已有该编号 q = true; break; } temp = temp.next; //以上三种都不是,指向下一个继续判断 } if(q){ System.out.println("该编号以存在~"); } else{ headNode.next = temp.next; //将要添加的数据的next域指向后一个 temp.next = headNode; //将要添加数据的前一个的next域指向要添加的数据 } } /** * 修改数据 */ public void update(HeadNode newHeadNode){ if(head.next == null){ //判断链表是否为空 System.out.println("该链表为空~"); return; } //辅助节点 HeadNode temp = head.next; Boolean flag = false; while (true){ if(temp.next == null){ //遍历到了尾节点 break; } if(temp.next.no == newHeadNode.no){ //判断要修改的对象的编号与链表中存在的编号相同 flag = true; break; } temp = temp.next; //指针向后移 } if(flag){ temp.next.name = newHeadNode.name; temp.next.nackName = newHeadNode.nackName; } else { System.out.println("没有找该编号:"+newHeadNode.no); } } /** * 删除节点 * 1.找到要删除的节点的前一个节点 * 2.把该节点的next域指向下一个节点的再下一个节点 */ public void delete(int no){ HeadNode temp = head; //辅助指针 Boolean falg = false; //表示是否找到要修改的前一个节点 if (temp.next == null){ //判断链表是否为空 System.out.println("该链表为空~"); return; } while (true){ if(temp.next == null){ //到达尾节点 break; } if(temp.next.no == no){ //找到要删除的节点的前一个节点 falg = true; break; } temp = temp.next; //指针后移 } if(falg){ temp.next = temp.next.next; //把该节点的next域指向下一个节点的再下一个节点 } else { System.out.println("未找到该节点~"); } } /** * 查询全部链表的方法 */ public void find(){ //判断链表是否为空 if(head.next == null){ System.out.println("此链表为空~"); return; } HeadNode temp = head.next; //头部节点往后的节点 while (true){ //判断节点是否最后 if(temp == null){ break; } System.out.println(temp.toString()); //输出节点信息 temp = temp.next; //将节点指针向后移 } } } /** * 设置一个实体类 */ static class HeadNode { private int no; //编号 private String name; //姓名 private String nackName; //诨名 private HeadNode next; //指针(next域) //构造方法 public HeadNode(int no, String name, String nackName) { this.no = no; this.name = name; this.nackName = nackName; } @Override public String toString() { return "HeadNode{" + "no=" + no + ", name='" + name + '\'' + ", nackName='" + nackName + '\''+ '}'; } } } 测试类: package com.sai.linkedList; /** * @Author sai * @Description SingleLinkedList_CRUD的测试类 * @Time 2020-07-01 14:59 */ public class SingleLinkedList_CRUD_Test { public static void main(String[] args) { SingleLinkedList_CRUD.HeadNode headNode1 = new SingleLinkedList_CRUD.HeadNode(1,"宋江","及时雨"); SingleLinkedList_CRUD.HeadNode headNode2 = new SingleLinkedList_CRUD.HeadNode(2,"卢俊义","玉麒麟"); SingleLinkedList_CRUD.HeadNode headNode3 = new SingleLinkedList_CRUD.HeadNode(3,"吴用","智多星"); SingleLinkedList_CRUD.HeadNode headNode4 = new SingleLinkedList_CRUD.HeadNode(4,"公孙胜","入云龙"); SingleLinkedList_CRUD.SingleLinkedList singleLinkedList = new SingleLinkedList_CRUD.SingleLinkedList(); //无序添加 // singleLinkedList.add(headNode1); // singleLinkedList.add(headNode2); // singleLinkedList.add(headNode3); // singleLinkedList.add(headNode4); //根据编号添加 singleLinkedList.addByOrder(headNode1); singleLinkedList.addByOrder(headNode4); singleLinkedList.addByOrder(headNode2); singleLinkedList.addByOrder(headNode3); //遍历输出 singleLinkedList.find(); System.out.println(); //修改 SingleLinkedList_CRUD.HeadNode updateHeadNode = new SingleLinkedList_CRUD.HeadNode(3,"小吴","星星"); singleLinkedList.update(updateHeadNode); //遍历输出 singleLinkedList.find(); System.out.println(); //删除 singleLinkedList.delete(5); //遍历输出 singleLinkedList.find(); } }