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


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


相关文章
|
1月前
|
Java
Java移除链表元素
Java移除链表元素
37 0
|
26天前
|
存储 Java
Java数据结构:链表
Java数据结构:链表
30 2
|
23天前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
5天前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
13 2
|
17天前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
9 2
|
17天前
|
算法 Java C语言
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
7 1
|
17天前
|
算法 安全 Java
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
15 1
|
22天前
|
存储 Java
Java 链接表(链表)详解与实现
Java 链接表(链表)详解与实现
16 2
|
25天前
|
存储 算法 Java
手撕Java集合——链表
手撕Java集合——链表
|
27天前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
29 0