java复习篇 数据结构:链表第二节 哨兵

本文介绍了如何使用哨兵优化单向链表的头插、尾插、get、insert和remove操作。哨兵节点简化了空链表的判断,避免了在某些操作中对头结点的特殊处理。详细阐述了每个操作的思路及实现代码,并进行了相应的测试验证。
摘要由CSDN通过智能技术生成

目录

单向链表哨兵

初始

头插

思路

代码

尾插

思路

遍历

遍历验证头插

尾插代码

尾插测试

get

思路

代码

测试

insert

思路

代码

测试

remove

移除头结点

提问

移除指定位置

测试


单向链表哨兵

单向链表里面有一个特殊的节点称为哨兵节点,不存储数据。

优势:简化了单向链表的空判断,例如 尾插、get、insert、remove

初始

public class SentinelLinkedListTest {
    
    // 头指针 指向哨兵(666是任意定义的一个值)
    private Node head = new Node(666, null);

    // 节点类      private对外隐藏细节
    @Data
    @AllArgsConstructor
    private static class Node {
        private int value;
        private Node next;
    }

}

将内部类定义为静态主要有两个原因:

实例化方式:静态内部类的实例化不需要依赖于外部类。而普通的内部类在实例化时会隐含地包含一个对外部类的引用,因此,普通的非静态内部类不能脱离外部类实例而单独存在。
访问方式:静态内部类可以使用静态方法直接通过类名来访问外部类的静态成员,而不需要创建外部类的实例。而普通的内部类需要先创建外部类的实例,然后通过该实例来访问外部类的静态成员。

头插

思路

对于使用者来说,我给你一个value值,你要将我的这个value值放入到链表头结点处。

不同于单向链表,这里一开始就有了哨兵

代码

    public void addFirst(int value) {
        head.next = new Node(value, head.next);
    }

哨兵的next指针指向新节点,新节点的next指针为之前哨兵的next指针指向的节点

尾插

思路

对于使用者来说,我给你一个value值,你要将我的这个value值放入到链表最后面

那我怎么知道你链表什么时候是最后面

遍历

遍历到最后一个节点,此时它的next指针指向null

注意:头指针是为了记录第一个节点地址,不能动,所以我定义一个可以移动的指针开始指向第一个节点

    public void foreach(Consumer<Integer> consumer) {
        Node p = head.next;
        while (p != null) {
            consumer.accept(p.value);
            p = p.next;
        }
    }

注:不同于单向链表,自定义的指针开始是指向哨兵的下一个节点地址。

遍历验证头插


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值