第二章 链表_707.设计链表

这篇具有很好参考价值的文章主要介绍了第二章 链表_707.设计链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


707.设计链表

一、题目你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

MyLinkedList() 初始化 MyLinkedList 对象。
int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

二、问题

1. 头结点和虚拟头结点的关系?

头结点是链表的第一个节点,是位置为 0 的节点。
虚拟头结点是为了方便操作链表而新添加的节点,初始化为 new ListNode(0)。刚开始,虚拟头结点的下一个节点是 头结点。

2. 链表的元素个数是多少?

链表的元素个数是 size + 1,size 是链表中有效元素的个数,1 是虚拟头结点。

3. 链表的位置是从几开始的?

链表的位置是从 0 开始的,位置为 0 的节点是头结点。有效的链表元素的位置是从 0 ~ size-1。

三、需要注意的地方

1. 插入删除节点需要有返回吗?

插入、删除不需要有返回。执行完对应的操作就可以了。最终链表是通过 head 虚拟头结点来获取的。

2. size 的变化

插入或删除节点,别忘了修改 size文章来源地址https://www.toymoban.com/news/detail-487433.html

四、代码

/**
 * <p>Title: 设计列表</p>
 * <p>Description: </p>
 *
 * @author su.gd
 * @date 2023-06-17
 */
public class MyLinkedList {
    // 链表的大小
    int size;
    // 虚拟头结点
    ListNode head;

    public MyLinkedList() {
        this.size = 0;
        // 虚拟头结点初始化的值是 0
        head = new ListNode(0);
    }

    /**
     * 查询第 i 个位置的节点
     * 查找的节点的位置是在 0 - size-1
     *
     * @param index
     * @return
     */
    public int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode cur = head;
        for (int i = 0; i <= index; i++) {
            cur = cur.next;
        }
        return cur.val;
    }

    /**
     * 在 index 的位置前插入节点
     * 插入的节点的位置是 index,所以需要找到 index 之前的那个位置
     * 如果 index < 0,就插在 0 的位置;
     * 如果 index = size,就插在最后一个节点之后
     * 如果 index > size,不能插入
     *
     * @param index
     * @param val
     */
    public void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        index = Math.max(0, index);
        ListNode pre = head;
        for (int i = 0; i < index; i++) {
            pre = pre.next;
        }
        // 要插入的新节点
        ListNode newNode = new ListNode(val);
        newNode.next = pre.next;
        pre.next = newNode;
        size++;
    }

    /**
     * 在头节点之前插入节点
     *
     * @param val
     */
    public void addAtHead(int val) {
        addAtIndex(0, val);
    }

    /**
     * 在尾节点之后插入节点
     *
     * @param val
     */
    public void addAtTail(int val) {
        addAtIndex(size, val);
    }

    /**
     * 删除 index 位置的节点
     * 需要找到 index 的前一个位置
     * 如果 index >= size 或 index < 0, 不需要删除
     * 如果 index = 0,就删除头结点
     *
     * @param index
     */
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        ListNode pre = head;
        for (int i = 0; i < index; i++) {
            pre = pre.next;
        }
        pre.next = pre.next.next;
        size--;
    }

}
class ListNode {
    int val;
    ListNode next;
    public ListNode() {}
    public ListNode(int val) {
        this.val = val;
    }
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

到了这里,关于第二章 链表_707.设计链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【一起啃书】《机器学习》第一章 绪论 + 第二章 模型评估与选择

    第一章 绪论 1. 机器学习 :研究如何通过计算的手段,利用经验来改善系统自身的性能。在计算机系统中,”经验“通常以“数据”的形式存在,所以机器学习研究的主要内容也是如何通过这些数据产生一个模型,进而通过这个模型为我们提供相应的判断。 2. 基本术语 :数

    2023年04月18日
    浏览(49)
  • 第二章:CSS基础进阶-part1:CSS高级选择器

    后代选择器:E F 子元素选择器: EF 相邻兄弟选择器:E+F 群组选择器:多个选择器以逗号隔开(selector1,selector2,…) 属性选择器:E[attr],E[attr=“value”], E[attr~=“value”] CSS 属性选择器通过已经存在的属性名或属性值匹配元素 伪类选择器(简称:伪类)通过冒号来定义,它定义了

    2024年02月13日
    浏览(36)
  • 算法设计与分析第二章作业

    题目 思路 判断最大子段和,可以用分治的思想,每次将序列一分为二,选择两个序列的最大子段和。 但是这里还有一种可能,就是子段可以横跨两个子序列,所以我们的最大子段和就是: MAX(左边序列最大字段和,横跨两序列的最大子段和,右边序列的最大子段和)。 对

    2024年02月05日
    浏览(50)
  • 《微服务架构设计模式》第二章

    软件架构的定义 看一下大佬是怎么说的: 计算机系统的软件架构是构建这个系统所需要的一组结构,包括软件元素、它们之间的关系以及两者的属性。 --Bass等著《Documenting Software Architectures:Views and Beyond》 这个定义将软件分解为元素和元素之间的关系两个部分,就像一辆汽车

    2024年02月09日
    浏览(41)
  • 《python语言程序设计基础》(第二版)第二章课后习题参考答案

    第二章 Python程序实例解析 2.1 温度转换 2.2 汇率兑换 优化: 优化的主要改动: 将货币符号和金额分离出来,使代码更加清晰易读。 将条件判断改为根据货币符号进行判断,避免重复判断。 2.3 绘制彩色蟒蛇 2.4 等边三角形的绘制 代码一: 代码二: 2.5 叠加等边三角形的绘制

    2024年03月19日
    浏览(58)
  • 【LeetCode题目详解】 203. 移除链表元素707. 设计链表206. 反转链表 day3(补)

    题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [], val = 1 输出:[] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:[] 看到这道题就想到了链表 这道题有两种写法,涉及如下链表操作的两种方式: 直接使用

    2024年02月16日
    浏览(41)
  • 【算法】算法设计与分析 课程笔记 第一章&第二章

    算法的四个性质: 输入、输出、确定性和有穷性 。 1. 常见的时间复杂度 常数阶 O(1) 对数阶 O(log n) 线性阶 O(n) 线性对数阶 O(nlog n) 平方阶 O(n^2) 立方阶 O(n^3) k 次方阶 O(n^k) 指数阶 O(2^n) 注:上面的 log n 均代表 以2为底 的对数。 2. 时间复杂度排序 常见的算法时间复杂度由小到

    2024年02月09日
    浏览(43)
  • 深入Kafka核心设计与实践原理读书笔记第二章

    配置生产者客户端参数及创建相应的生产者实例。 构建待发送的消息。 发送消息 关闭实列 参数说明 bootstrap.servers :用来指定生产者客户端链接Kafka集群搜需要的broker地址清单,具体格式 host1:port1,host2:port2,可以设置一个或多个地址中间,号分割,参数默认 空串。 这里要注意

    2023年04月08日
    浏览(79)
  • 谭浩强【C语言程序设计】第二章习题详解

      目录 ​编辑 1,什么是算法?试从日常生活中找3个例子,描述它们的算法。 2,什么叫结构化的算法?为什么要提倡结构化的算法? 3,试述3种基本结构的特点,请另外设计两种基本结构(要符合基本结构的特点)。 4,用传统流程图表示求解以下问题的算法。 (1)有两个

    2024年02月01日
    浏览(46)
  • 《微服务架构设计模式》第二章 服务的拆分策略

    内容总结自《微服务架构设计模式》 软件架构的定义:计算机系统的软件架构是构建这个系统所需要的一组结构,包括软件元素、他们之间的关系以及两者的属性(Bass等著) 其实质是应用程续的架构将软件分解为元素(element)和这些元素之间的关系(relation)。由于这两个

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包