java复习篇 数据结构:链表第一节

目录

单向链表

初始

头插

思路

情况一

情况二

代码

尾插

思路

遍历

优化遍历

遍历验证头插

尾插代码

优化

尾插测试

get

思路

代码

测试

insert

思路

代码

优化

测试

remove

移除头结点

提问

移除指定位置

测试


单向链表

每个元素只知道自己的下一个元素是谁,最后一个元素的下一个元素为null

初始

public class SingleLinkedList {
    
    // 头指针
    private Node head;

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

}

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

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

头插

思路

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

情况一

一开始,无节点,现在新增一个新节点

head = new Node(value, null);

情况二

一开始,有节点,现在新增一个新节点

head = new Node(value, head);

新节点的next指针指向原来节点,原来节点地址为头指针指向的地址

代码

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

为什么没有情况一?

开始时,head为null,情况二包含情况一

尾插

思路

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

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

遍历

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

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

    public void foreach() {
        Node p = head;
        while (p != null) {
            System.out.println(p.value);
            p = p.next;
        }
    }

优化遍历

实际开发中,你可能不是要打印,而是对加进来的值有其他操作,此时,换成函数式编程

    public void foreach(Consumer<Integer> consumer) {
        Node p =
  • 60
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值