IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 双链表增删改查+排序插入 -> 正文阅读

[数据结构与算法]双链表增删改查+排序插入

思考

双向链表,遍历,添加,修改,删除的思路
遍历:与单链表意义,但是可以双向查找
添加:默认添加到表尾,
      先找到要最后一个节点tmp
     1.newHeroNode.next = tmp.next;把后面的连上
     2.newHeroNode.prev = tmp ;
     3. newHeroNode.next = newNode.prev 把前面的连上
修改:与原来单向链表一样,之间找到要修改的节点

 删除:找到要删除的节点 p
 p.prev.next = p.next ;
 p.next.prev = p.prev;

节点类

 class DHeroNode{
    public DHeroNode prev;
    public int no;
    public DHeroNode next;
    public String name;
    public String nickname;

     public DHeroNode(int no, String name, String nickname) {
         this.no = no;
         this.name = name;
         this.nickname = nickname;
     }

     public DHeroNode() {
     }

     @Override
     public String toString() {
         return "[no:"+ no
                 +",name:" + name
                 + ",nickname:" +nickname
                 +"]";
     }
 }

链表类

class DoubleLinkedList{
    private DHeroNode head = new DHeroNode(0,"","");

    //遍历打印
    public void list(){
        if(head.next == null){
            System.out.println("链表是空的");
            return;
        }
        DHeroNode tmp = head.next;
        while(tmp != null){
            System.out.println(tmp);
            tmp = tmp.next;
        }
    }
    //添加节点到末尾
    public void addToEnd(DHeroNode newHero){
        DHeroNode tmp = head;
        while(tmp.next != null){
            tmp = tmp.next;
        }//循环完毕时,tmp指向最后一个节点
        newHero.next = null;//将新加结点后一个赋空值
        tmp.next = newHero;
        newHero.prev = tmp;
    }
    //修改指定位置元素
    public void update(DHeroNode heroNode){
        if(head.next == null){
            System.out.println("表为空");
            return ;
        }
        DHeroNode tmp = head.next;
        boolean flag = false;
        while(true){
            if(tmp == null){//遍历完毕
                break;
            }if(heroNode.no == tmp.no){
                flag = true;
                break;
            }
            tmp = tmp.next;//不断下移
        }
        if(flag){
            tmp.name = heroNode.name;
            tmp.nickname = heroNode.nickname;
        }else{
            System.out.println("没找到此节点,不能修改");
        }
    }
    //获取长度
    public int getLength(){
        if(head.next == null){
            System.out.println("表为空");
            return 0;
        }
        DHeroNode cur = head.next;
        int len = 0;
        while(cur != null){
            len++;
            cur = cur.next;
        }
        return len;
    }
    //删除节点
    public void delete(int no){
        if(head.next == null){
            System.out.println("链表为空,不能删除");
            return;
        }
        DHeroNode tmp = head.next;
        boolean flag = false;
        while(tmp != null){
            if(tmp.no == no){
                flag = true;
                break;
            }
            tmp = tmp.next;
        }
        if(flag){
            tmp.prev.next = tmp.next;
            //如果是最后一个节点回出现问题
            if(tmp.next != null) {
                tmp.next.prev = tmp.prev;
            }
        }else {
            System.out.println("没找到该节点");
        }
    }

    //按照编号顺序添加
    public void addByOrder(DHeroNode heroNode){
        if(head.next == null) {
            head.next = heroNode ;
            return;
        }
        //插入位置在队首
        DHeroNode tmp = head.next;
        if(heroNode.no < tmp.no){
            head.next = heroNode;
            heroNode.next = tmp;
            heroNode.prev = head;
            tmp.prev = heroNode;
            return;
        }
        while(tmp != null) {
            if (tmp.next != null) {//插入位置在中间
                if (tmp.no < heroNode.no && heroNode.no < tmp.next.no) {
                    heroNode.next = tmp.next;
                    tmp.next.prev = heroNode;
                    tmp.next = heroNode;
                    heroNode.prev = tmp;
                    return;
                }
            }
            if (tmp.next == null) {//插到末尾
                if (tmp.no < heroNode.no) {
                    heroNode.next = null;//先连接后面
                    heroNode.prev = tmp;
                    tmp.next = heroNode;
                    return;
                }
            }
            tmp = tmp.next;
        }
    }
}

测试

public class DLinkedListDemo {
    public static void main(String[] args) {
        DHeroNode heroNode1 = new DHeroNode(1, "宋江", "及时雨");
        DHeroNode heroNode2 = new DHeroNode(2, "卢俊义", "玉麒麟");
        DHeroNode heroNode3 = new DHeroNode(3, "吴用", "智多星");
        DHeroNode heroNode4 = new DHeroNode(4, "林冲", "豹子头");
        DHeroNode heroNode5 = new DHeroNode(5, "鲁智深", "花和尚");

        DoubleLinkedList singleLinkedList1 = new  DoubleLinkedList();
        singleLinkedList1.addByOrder(heroNode5);
        singleLinkedList1.addByOrder(heroNode1);
        singleLinkedList1.addByOrder(heroNode2);
        singleLinkedList1.addByOrder(heroNode4);
        singleLinkedList1.addByOrder(heroNode3);
        singleLinkedList1.list();


//        System.out.println("修改");
//        singleLinkedList1.update(new DHeroNode(3,"公孙胜","入云龙"));
//        singleLinkedList1.list();
//        System.out.println("删除");
//        singleLinkedList1.delete(3);
//        singleLinkedList1.list();
//        System.out.println(singleLinkedList1.getLength());
    }
}

小结

在删除节点时,注意未节点的删除与其他节点删除不同,tail.next.prev = tail.prev会报空指针异常,
插入操作要注意不要弄丢指针,可以多使用两个临时节点用来记录要删除节点tmp的前一个节点tmp.next和后一个节点tmp.prev
头指针不能动
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 09:06:11  更:2021-11-26 09:07:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 16:01:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码