Java 实现双链表

简介: Java 实现双链表

双链表(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 方法通过遍历链表查找指定编号的节点,并返回该节点的引用。


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


相关文章
|
2月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
24 3
|
5月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
3月前
|
存储 Java
|
3月前
|
存储 Java
java实现单链表的创建、增、删、改、查
这篇文章详细介绍了Java中如何实现单链表的创建以及对单链表进行增加、删除、修改、查询等操作的方法,并提供了相应的代码示例。
java实现单链表的创建、增、删、改、查
|
3月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
3月前
|
存储 Java
java实现双向链表的增删改查
这篇文章展示了如何在Java中实现双向链表的增加、删除、修改和查询操作,并通过代码示例演示了在双向链表中存储和操作学生信息的过程。
|
3月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
54 0
|
3月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
45 0
|
6月前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
下一篇
无影云桌面