4. 双向链表的增删改查

    科技2022-07-16  95

    1. 什么是双向链表

    2.双向链表的节点实现

    no name nickName 都是data域pre 是一个对象,指向前一个节点next也是对象,指向后一个节点重写有参构造方法和toString方法 //创建一个节点的类 class DoubleNode{ public int no; public String name; public String nickName; public DoubleNode next; // 指向下一个节点,默认为null public DoubleNode pre; // 指向上一个节点,默认为null public DoubleNode(int no, String name, String nickName) { this.no = no; this.name = name; this.nickName = nickName; } @Override public String toString() { return "DoubleNode{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + '\'' + '}'; } }

    3.把节点整合起来实现双链表

    对双链表实现创建,删除,修改,查询 插入到最后的思路,也就是按照代码的顺序插入 按照节点的no插入思路,也就是按照no的大小来排序

    修改节点,找到节点修改就可以了

    代码实现

    //创建一个双向链表 class DoubleLinkedListDemo{ //先初始化一个头结点,头结点不要动,不存放具体的数据 private DoubleNode head = new DoubleNode(0,"",""); //返回头结点 public DoubleNode getHead(){ return head; } //遍历双向链表的方法 public void list(){ //判断链表是否为空 if (head.next==null){ System.out.println("链表为空"); return; } //因为头结点不能动,所以我们需要一个辅助变量来遍历 DoubleNode temp = head.next; while (true){ //判断链表是否到了最后 if (temp==null){ break; } //输出节点信息 System.out.println(temp); //将节点后移 temp=temp.next; } } //添加节点,默认添加到双向链表到尾部 public void add(DoubleNode doubleNode){ //因为head节点不能动,因此我们需要一个辅助遍历temp DoubleNode temp = head; //遍历链表找到最后 while (true){ //找到链表的最后 if (temp.next==null){ break; } //如果还没有找到最后,那么将temp向后移动 temp=temp.next; } //当退出while循环的时候,temp就指向了链表的最后 //然后将我们的节点插入到next后面,指向新的节点 temp.next=doubleNode; //让最后一个节点的下一个节点等于我们的新节点 doubleNode.pre=temp; //我们新节点的前一个节点,指向最后一个节点 //通过上面两行代码,我们的双向链表就此实现 } //添加节点,按照编号来排序 public void add2(DoubleNode doubleNode){ //因为头结点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置 //因为双链表,因此我们找的temp位于添加位置的前一个节点,否则插入不了 DoubleNode temp = head; boolean flag = false; //标识添加的编号是否存在,默认为false while (true){ if(temp.next==null){ //说明temp在链表的最后 break; } if (temp.next.no>doubleNode.no){ //位置找到了,就在这个temp的前面插入 break; } if (temp.next.no==doubleNode.no){ //说明添加的hero存在,不能添加 flag = true; break; } temp = temp.next; //后移,遍历当前的链表 } //判断flag的值 if (flag){ //不能添加说明有了这个编号存在 System.out.printf("准备插入的编号 %d 已经存在,无法添加\n",doubleNode.no); }else { if (temp.next!=null){ //如果不是插入到最后 doubleNode.pre = temp; temp.next.pre = doubleNode; doubleNode.next = temp.next; temp.next = doubleNode; }else { //插入到最后 doubleNode.pre = temp; doubleNode.next = null; temp.next = doubleNode; } } } //修改节点信息 public void update(DoubleNode doubleNode){ //判断是否为空 if (head.next == null){ System.out.println("链表为空"); return; } //找到需要修改的节点,根据no来找 //定义一个辅助变量 DoubleNode temp = head.next; boolean flag = false; //表示是否找到该节点 while(true){ if (temp==null){ break;//表示链表已经遍历完了 } if (temp.no==doubleNode.no){ //找到了 flag = true; break; } temp = temp.next; } //根据flag,判断是否找到要修改的节点 if (flag == true){ temp.name = doubleNode.name; temp.nickName = doubleNode.nickName; }else { //没有这个节点 System.out.printf("没有找到编号等于%d的节点,不能修改\n",doubleNode.no); } } //删除一个节点 public void delete(int no){ //对于双向链表我们可以直接找到要删除的节点 DoubleNode temp = head.next; //辅助变量 //判断当前列表是否为空,如果为空我就不去删除了 if (temp.next==null){ System.out.println("当前链表为空,无法删除"); return; } boolean flag = false; //标志是否找到删除节点 while (true){ if (temp==null){ //说明到了链表的最后了 break; } if (temp.no==no){ //找到删除的节点 flag=true; break; } temp=temp.next; } //判断flag if (flag){ //删除节点temp temp.pre.next = temp.next; //这里我们的代码有问题 //这里我们需要判断,如果是最后一个节点,就不需要执行下面这一句代码 if (temp.next!=null){ temp.next.pre=temp.pre; } }else{ System.out.printf("要删除的节点%d不存在\n",no); } } }

    3.测试

    public class DoubleLinkedList { public static void main(String[] args) { //测试 //创建节点 DoubleNode her3= new DoubleNode(3, "李颖", "天府行"); DoubleNode her4= new DoubleNode(4, "行者", "武松"); DoubleNode her1= new DoubleNode(1, "鲁智深", "花和尚"); DoubleNode her2= new DoubleNode(2, "卢俊义", "玉麒麟"); //创建一个双向链表 DoubleLinkedListDemo doubleLinkedListDemo = new DoubleLinkedListDemo(); doubleLinkedListDemo.add(her3); doubleLinkedListDemo.add(her4); doubleLinkedListDemo.add(her1); doubleLinkedListDemo.add(her2); //打印双向链表 System.out.println("按照代码顺序打印"); doubleLinkedListDemo.list(); System.out.println("======================================================"); DoubleNode her8= new DoubleNode(8, "卢俊义", "玉麒麟"); DoubleNode her7= new DoubleNode(7, "鲁智深", "花和尚"); DoubleNode her6= new DoubleNode(6, "行者", "武松"); DoubleNode her5= new DoubleNode(9, "李颖", "天府行"); //创建一个双向链表 DoubleLinkedListDemo doubleLinkedListDemo2 = new DoubleLinkedListDemo(); doubleLinkedListDemo2.add2(her7); doubleLinkedListDemo2.add2(her8); doubleLinkedListDemo2.add2(her5); doubleLinkedListDemo2.add2(her6); System.out.println("按照编号顺序打印"); doubleLinkedListDemo2.list(); System.out.println("======================================================"); //修改节点信息 doubleLinkedListDemo2.update(new DoubleNode(6, "鲁智深2", "花和尚2")); System.out.println("打印修改节点后的信息"); doubleLinkedListDemo2.list(); System.out.println("======================================================"); //删除节点信息 System.out.println("删除节点后"); doubleLinkedListDemo2.delete(7); doubleLinkedListDemo2.list(); System.out.println("======================================================"); } }

    结果:

    Processed: 0.009, SQL: 8