美文网首页
双向链表的增删改

双向链表的增删改

作者: YAOPRINCESS | 来源:发表于2020-07-03 15:04 被阅读0次

结果

image.png

feature

  • 有直接添加到链表尾部的方法
  • 有number大小添加元素的方法

完整测试代码

package com.nan;

/**
 * @author klr
 * @create 2020-07-02-22:29
 */
public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode2 hero4 = new HeroNode2(4, "林冲4", "豹子头");
        HeroNode2 hero10 = new HeroNode2(8, "林冲8", "豹子头");
        HeroNode2 hero1 = new HeroNode2(1, "宋江1", "及时雨");
        HeroNode2 hero2 = new HeroNode2(2, "卢俊义2", "玉麒麟");
        HeroNode2 hero3 = new HeroNode2(3, "吴用3", "智多星");

        DoubleLinkedList dl = new DoubleLinkedList();
//        dl.add(hero1);
//        dl.add(hero2);
//        dl.add(hero3);
//        dl.add(hero4);
//        dl.add(hero10);
        dl.addByOrder(hero4);
        dl.addByOrder(hero1);
        dl.addByOrder(hero3);
        dl.addByOrder(hero2);
        dl.addByOrder(hero10);
        System.out.println("展示双向链表所有结点");
        dl.list();
        System.out.println("删除结点");
        dl.delete(2);
        dl.list();
        System.out.println("修改结点");
        dl.update(new HeroNode2(1,"修改后的结点","及时雨"));
        dl.list();
    }
}


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

    public HeroNode2 getHead() {
        return head;
    }

    //只在最后插入结点
    public void add(HeroNode2 heroNode2){
        if (head.next == null) {
            head.next=heroNode2;
            return;
        }
        HeroNode2 temp = head.next;
        while (true) {
            if(temp.next == null){
                break;//找到最后
            }
            temp=temp.next;
        }
        temp.next= heroNode2;
        heroNode2.pre=temp;
    }

    //按顺序添加
    public void addByOrder(HeroNode2 heroNode2) {
        if (head.next == null) {
            head.next=heroNode2;
            heroNode2.pre=head;
            return;
        }
        HeroNode2 pre=head;
        HeroNode2 temp= head.next;
        while (temp!=null) {
            if(heroNode2.number<temp.number){
                break;
            }
            pre=pre.next;
            temp=temp.next;
        }
        if(temp==null){
            pre.next=heroNode2;
            heroNode2.pre=pre;
            return;
        }
        heroNode2.next=temp;
        temp.pre=heroNode2;
        pre.next=heroNode2;
        heroNode2.pre=pre;
    }

    //删除结点
    public void delete(int number) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        HeroNode2 temp = head.next;
        boolean flag = false;
        while (temp!=null) {
            if(temp.number==number){
                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("未找到该节点,无法删除");
        }
    }

    //根据id修改结点
    public void update(HeroNode2 newHeroNode) {
        if (head.next == null) {
            System.out.println("链表为空,无法修改");
            return;
        }
        HeroNode2 temp = head.next;
        boolean flag = false;
        while (true) {
            if (temp == null) {
                break;//已经遍历完链表
            }
            if (temp.number == newHeroNode.number) {
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag) {
            temp.name = newHeroNode.name;
            temp.nickName = newHeroNode.nickName;
        }
        else {
            System.out.printf("未找到编号为%d的英雄\n",newHeroNode.number);
        }
    }

    //遍历
    public void list(){
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        //因为head不能动
        HeroNode2 temp = head.next;
        while (true) {
            //判断是否到链表最后
            if (temp == null) {
                break;
            }
            //输出结点信息
            System.out.println(temp);
            //将temp后移
            temp = temp.next;
        }
    }
}


class HeroNode2 {
    public int number;
    public String name;
    public String nickName;
    public HeroNode2 pre;
    public HeroNode2 next;

    public HeroNode2(int number, String name, String nickName) {
        this.number = number;
        this.name = name;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "HeadNode{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

相关文章

  • Python实现双向链表

    Python实现双向链表的增删改查,反转链表

  • 3.循环链表

    双向链表的增删改查功能

  • ArrayList/LinkedList

    一。LinkedList:数据结构是双向链表 list的增删改查1.增(加元素) 其他的方法暂时不罗列2.删除元素...

  • 双向链表的增删改

    结果 feature 有直接添加到链表尾部的方法 有number大小添加元素的方法 完整测试代码

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 线性表-双向链表与双向循环链表

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

  • 双向链表和双向循环链表

    双向链表 线性表-双向链表的结点结构: 带头结点的双向链表: 1.双向链表初始化 2.遍历双向链表 2.双向链表插...

  • 双向链表&双向循环链表

    一、双向链表 带有前驱结点、后区节点 双向链表的创建 双向链表插入-逻辑 双向链表删除 删除双向链表指定的元素 二...

  • 9.双向链表DoubleLinkList

    目录:1.双向链表的定义2.双向链表的图解3.双向链表定义操作4.双向链表的实现 1.双向链表的定义 2.双向链表...

  • day03-双向链表

    双向链表: 单向链表只能单向查找,双向链表可以双向查找。 啥是双向链表? 双向链表可以双向查数据,所以就不存在单向...

网友评论

      本文标题:双向链表的增删改

      本文链接:https://www.haomeiwen.com/subject/uiusqktx.html