文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java如何实现双向链表的增删改

2023-06-30 16:45

关注

这篇文章主要介绍“java如何实现双向链表的增删改”,在日常操作中,相信很多人在java如何实现双向链表的增删改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java如何实现双向链表的增删改”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找

单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除

遍历方和单链表一样,只是可以向前,也可以向后查找

添加(默认添加到双向链表的最后)

(1) 先找到双向链表的最后这个节点

(2) temp.next = newHeroNode

(3) newHeroNode.pre = temp

修改思路和原来的单向链表一样

删除

(1) 因为是双向链表,因此,我们可以实现自我删除某个节点

(2) 直接找到要删除的这个节点,比如temp

(3) temp.pre.next = temp.next

(4) temp.next.pre = temp.pre

代码实现

package com.hsy.linkedlist;public class DoubleLinkedListDemo {    public static void main(String[] args) {        System.out.println("双向链表测试:");        //先创建节点        HeroNode2 hero1 = new HeroNode2(1, "刘备", "仁义");        HeroNode2 hero2 = new HeroNode2(2, "关羽", "武圣");        HeroNode2 hero3 = new HeroNode2(3, "张飞", "暴躁");        HeroNode2 hero4 = new HeroNode2(4, "赵云", "单骑救主");        //创建一个双向链表        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();        doubleLinkedList.add(hero1);        doubleLinkedList.add(hero2);        doubleLinkedList.add(hero3);        doubleLinkedList.add(hero4);        //显示链表        doubleLinkedList.showList();        //修改        HeroNode2 newHeroNode = new HeroNode2(4, "好汤圆", "hsy");        doubleLinkedList.update(newHeroNode);        System.out.println("修改后:");        doubleLinkedList.showList();        //删除        doubleLinkedList.delete(3);        System.out.println("删除后:");        doubleLinkedList.showList();    }}//创建一个双向链表class DoubleLinkedList {    //初始化一个头节点,不存放数据    private final HeroNode2 head = new HeroNode2(0, "", "");    //返回头节点    public HeroNode2 getHead() {        return head;    }    //遍历    public void showList() {        //判断链表是否为空        if (head.next == null) {            System.out.println("链表为空!");        }        //由于头节点不能动,因此我们需要一个辅助变量来遍历        HeroNode2 temp = head.next;        while (true) {            //判断链表是否到最后            if (temp == null) {                break;            }            System.out.println(temp);            //这时需要将temp后移,否则会陷入死循环            temp = temp.next;        }    }    //添加一个新的节点在双向链表中    public void add(HeroNode2 heroNode2) {        //思路:(不考虑编号顺序)        //1.找到当前链表的最后节点        //2.将最后这个节点的next域指向新的节点        HeroNode2 temp = head;        //遍历链表,找到最后的节点        while (true) {            if (temp.next == null) {                break;            }            //如果没有找到最后,将temp后移            temp = temp.next;        }        //必须保证退出while循环时,temp指向链表的最后,并将最后这个节点的next域指向新的节点        //形成一个双向链表        temp.next = heroNode2;        heroNode2.pre = temp;    }    //修改节点    public void update(HeroNode2 newHeroNode2) {        //判断链表是否为空        if (head.next == null) {            System.out.println("链表为空!");        }        HeroNode2 temp = head.next;        boolean flag = false;        while (true) {            if (temp == null) {                break;            }            if (temp.no == newHeroNode2.no) {                //找到                flag = true;                break;            }            temp = temp.next;        }        //根据flag判断是否找到需要修改的值        if (flag) {//编号已经存在            temp.name = newHeroNode2.name;            temp.nickname = newHeroNode2.nickname;        } else {//没有找到            System.out.println("没有找到编号为:" + newHeroNode2.no + "的节点,不能修改");        }    }    //删除节点    public void delete(int no) {        //判断当前链表是否为空        if (head.next==null){            System.out.println("链表为空,无法删除");        }        HeroNode2 temp = head.next;        boolean flag = false;        while (true) {            if (temp == null) {                break;            }            if (temp.no == no) {                //找到了待删除节点的前一个结点temp                flag = true;                break;            }            temp = temp.next;        }        if (flag) {            temp.pre.next = temp.next;            //如果要删除的是最后一个节点,就不能执行下面这句话,否则会出现空指针异常            if (temp.next!=null){                temp.next.pre=temp.pre;            }        } else {            System.out.println("要删除的" + no + "节点不存在");        }    }}class HeroNode2 {    public int no;    public String name;    public String nickname;    public HeroNode2 next;//指向下一个节点    public HeroNode2 pre;//指向上一个节点    //创建构造器    public HeroNode2(int no, String name, String nickname) {        this.no = no;        this.name = name;        this.nickname = nickname;    }    @Override    public String toString() {        return "HeroNode{" +                "no=" + no +                ", name='" + name + '\'' +                ", nickname='" + nickname + '\'' +                '}';    }}

到此,关于“java如何实现双向链表的增删改”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯