Java 实现双链表

发布时间:2024年01月16日

文章目录



在这里插入图片描述

双链表(Doubly Linked List)是一种常用的数据结构,它与单链表相似,但每个节点除了包含指向下一个节点的指针外,还包含一个指向前一个节点的指针。

双链表的节点由三部分组成数据域(存储节点的数据)、指向前一个节点的指针和指向后一个节点的指针。 通过这两个指针,双链表可以在前向和后向两个方向上遍历和操作节点。

双链表相对于单链表的主要优点是,它可以方便地在给定节点的前后插入或删除节点,而无需遍历查找。这使得双链表在某些场景下更加高效。

另外,双链表支持双向遍历。即可以从头节点开始,按照后继指针一直遍历到尾节点,也可以从尾节点开始,按照前驱指针一直遍历到头节点。

虽然双链表在插入和删除操作上比单链表更加灵活,但相应地也需要更多的存储空间来存储额外的指针。因此,在空间有限的情况下,需要权衡使用单链表或双链表来满足特定需求。

代码实现:

public class HeroNode2 {

    public int no;

    public String nickname;

    public HeroNode2 pre;

    public HeroNode2 next;

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

    @Override
    public String toString() {
        return "HeroNode2{" +
                "no=" + no +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}
public class DoubleLinkedList {

    // 先初始化一个头节点, 头节点不要动, 不存放具体的数据
    private HeroNode2 head = new HeroNode2(0,"");

    /** 添加 */
    public void add(HeroNode2 newNode){
        if( newNode == null ){
            return;
        }
        HeroNode2 currentNode = head;
        while (currentNode.next != null){
            currentNode = currentNode.next;
        }
        currentNode.next = newNode;
        newNode.pre = currentNode;
    }

    /** 删除 */
    public void del(int no){
        if( no < 1 ){
            return;
        }
        HeroNode2 currentNode = head.next;
        while ( currentNode != null ){
            if( currentNode.no == no ){
                if( currentNode.next == null ){
                    currentNode.pre.next = null;
                }else{
                    currentNode.pre.next = currentNode.next;
                    currentNode.next.pre = currentNode.pre;
                }
                return;
            }
            currentNode = currentNode.next;
        }
    }

    /** 遍历 */
    public void show(){
        HeroNode2 currentNode = head.next;
        while (currentNode != null){
            System.out.println(currentNode);
            currentNode = currentNode.next;
        }
    }

    /** 查询 */
    public HeroNode2 getByNo(int no){
        if( no < 1 ){
            return null;
        }
        HeroNode2 currentNode = head.next;
        while ( currentNode != null ){
            if( currentNode.no == no ){
                return currentNode;
            }
            currentNode = currentNode.next;
        }
        return null;
    }
}

这段代码实现了一个双链表(DoubleLinkedList)的基本操作,包括添加节点、删除节点、遍历和根据节点编号查询节点等操作。

首先,在双链表类中初始化了一个头节点 head,该头节点不存放具体的数据,仅作为链表的起始标志。

添加节点的 add 方法通过遍历链表找到尾节点,然后将新节点加在尾节点之后,同时设置新节点的前驱指针为当前尾节点。

删除节点的 del 方法首先根据传入的节点编号查找到要删除的节点,然后根据节点的前驱和后继节点情况进行连接操作,从而将该节点从链表中删除。

遍历链表的 show 方法通过遍历输出链表中所有节点的内容,便于查看链表中的数据。

根据节点编号查询节点的 getByNo 方法通过遍历链表查找指定编号的节点,并返回该节点的引用。


双链表是一种使用两个指针的数据结构,它可以支持在节点前后插入或删除节点,并且可以在前向和后向两个方向上遍历和操作节点。



在这里插入图片描述



文章来源:https://blog.csdn.net/2301_78386975/article/details/135606152
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。