数据结构——双向链表(Java实现)

1.4 双向链表

1.4.1 双向链表介绍

  • 双向链表相比于单链表多了一个prev指针指向该节点的前一个节点
  • 示意图:

1.4.2 双向链表实现思路

在这里插入图片描述

  • 添加

    • 添加到最后

    • 按照顺序添加
      在这里插入图片描述

  • 删除
    在这里插入图片描述

1.4.3 双向链表实现代码及其输出结果

import java.util.Objects;
import java.util.Stack;

class doubleLinkList{
    private HeroNode02 head = new HeroNode02(0,"","");
    public HeroNode02 getHead(){
        return head;
    }
    public void addNodeByOrder(HeroNode02 heroNode){ // 按no顺序插入
        HeroNode02 temp = head;
        while(temp.getNext() != null){
            if(Objects.equals(temp.getNext().getNo(), heroNode.getNo())){
                System.out.println("链表内已有该no的节点!");
                return;
            }
            if(heroNode.getNo() > temp.getNext().getNo()){
                temp = temp.getNext();
            } else if (heroNode.getNo() < temp.getNext().getNo()) {
                System.out.println("根据no顺序添加节点: "+heroNode.getNo());
                heroNode.setNext(temp.getNext());
                heroNode.setPrev(temp);
                temp.getNext().setPrev(heroNode);
                temp.setNext(heroNode);
                return;
            }
        }
        // 链表为空情况下
        System.out.println("添加节点到空链表: "+heroNode.getNo());
        temp.setNext(heroNode);
        heroNode.setPrev(temp);
    }
    public boolean isEmpty(){ // 判断链表是否为空
        return head.getNext() == null;
    }
    public void addNode(HeroNode02 heroNode){ // 添加链表节点
        HeroNode02 temp = head;
        while (temp.getNext() != null){ // 当前节点的next为null的时候遍历结束
            temp = temp.getNext();
        }
        System.out.println("添加节点到最后: "+heroNode.getNo());
        // 将最后一个节点的next指向新节点
        temp.setNext(heroNode);
        // 新节点的prev指针指向前一个节点
        heroNode.setPrev(temp);
    }
    public void show(){ // 遍历链表
        System.out.println("显示全部节点: ");
        if (isEmpty()) {
            System.out.println("链表为空!");
            return;
        }
        HeroNode02 temp = head.getNext();
        while (temp!=null){
            System.out.println(temp);
            temp = temp.getNext();
        }
    }

    public HeroNode02 getOne(Integer no){ // 根据no查询节点
        if (isEmpty()) {
            System.out.println("链表为空!");
            return null;
        }
        HeroNode02 temp = head.getNext();
        while(!Objects.equals(temp.getNo(), no)){
            temp = temp.getNext();
            if (temp == null){ // 如果遍历链表也查不到 那么返回null
                System.out.println("查无此节点!");
                return null;
            }
        }
        return temp;
    }
    public void update(Integer no,String name,String nickName){ // 修改节点data域
        if (isEmpty()) {
            System.out.println("链表为空!");
            return;
        }
        HeroNode02 heroNode = getOne(no);
        heroNode.setName(name);
        heroNode.setNickname(nickName);
    }
    public void deleteNode(Integer no){ // 删除节点
        if (isEmpty()) {
            System.out.println("链表为空!");
            return;
        }
        HeroNode02 temp = head.getNext();
        /**
         *  想要删除一个节点: 1.将该节点的前一个节点的next指向删除节点的下一个节点
         *                  2. 将该节点删除(释放内存,在Java里这一步由JVM垃圾回收器执行)
         */
        while (!Objects.equals(temp.getNo(), no)){
            temp = temp.getNext();
            if(temp == null){
                System.out.println("查无此节点!");
                return;
            }
        }
        System.out.println("删除节点: "+no);
        if (temp.getNext()!=null){ // 当前节点不是最后节点
            temp.getPrev().setNext(temp.getNext());
            temp.getNext().setPrev(temp.getPrev());
        }else { // 若当前节点是最后一个节点时,只需要修改倒数第二个节点的next指针
            temp.getPrev().setNext(null);
        }

    }
}
class HeroNode02{
    private Integer no; // 排名
    private String name;// 姓名
    private String nickname;// 外号
    private HeroNode02 next; // 指向后一个节点
    private HeroNode02 prev;// 指向前一个节点
    public HeroNode02(){}
    public HeroNode02(Integer no,String name,String nickname){
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        if (next!=null)
            return "[prev: "+prev.getNo()+", No: " +no+", name: "+name+", nickName: "+nickname+", nextNo:"+next.getNo()+
                    "]";
        else
            return "[prev: "+prev.getNo()+", No: " +no+", name: "+name+", nickName: "+nickname+", nextNo:"+
                    " null]";
    }
    public Integer getNo() {return no;}
    public void setNo(Integer no) {this.no = no;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getNickname() {return nickname;}
    public void setNickname(String nickname) {this.nickname = nickname;}
    public HeroNode02 getNext() {return next;}
    public void setNext(HeroNode02 next) {this.next = next;}
    public HeroNode02 getPrev() {return prev;}
    public void setPrev(HeroNode02 prev) {this.prev = prev;}
}

public class doubleLinkedListDemo {
    public static void main(String[] args) {
        doubleLinkList doubleLinkList = new doubleLinkList();
        doubleLinkList.addNodeByOrder(new HeroNode02(1,"小李1","小黑子1号"));
        doubleLinkList.addNode(new HeroNode02(2,"小李2","小黑子2号"));
        doubleLinkList.addNode(new HeroNode02(3,"小李3","小黑子3号"));
        doubleLinkList.addNode(new HeroNode02(4,"小李4","小黑子4号"));
        doubleLinkList.addNode(new HeroNode02(5,"小李5","小黑子5号"));
        doubleLinkList.addNode(new HeroNode02(6,"小李6","小黑子6号"));
        doubleLinkList.show();
        doubleLinkList.deleteNode(3);
        doubleLinkList.show();
        doubleLinkList.addNode(new HeroNode02(7,"小李7","小黑子7号"));
        doubleLinkList.show();
        doubleLinkList.deleteNode(7);
        doubleLinkList.show();
        doubleLinkList.addNodeByOrder(new HeroNode02(3,"小李3","小黑子3号"));
        doubleLinkList.show();
    }
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值