趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)

这篇具有很好参考价值的文章主要介绍了趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

练习 2 —— 顺序表/链表力扣刷题(中等难度)

1. 反转链表 II

力扣原题:https://leetcode.cn/problems/reverse-linked-list-ii/

题目描述

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1

趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2

输入:head = [5], left = 1, right = 1
输出:[5]

1.1 解题方法 1

问题分析 拆解成为 子串 + 反转 + 拼凑 的三个问题

这里假设我们小伙伴们都刷过 “反转链表” 那道题(https://leetcode.cn/problems/reverse-linked-list/)我们比较这两道题就可以发现其中的 "反转部分其实是一样的,只是我们这个时候需要考虑的是 子链表反转

所以我们可以大大方方地把前面一道的代码 copy 下来,用来做这道题。

所以接下来的问题就变成了求子链表的问题,我们把原来的链表拆分成三个子链表。

首先,对于第一个子链表,我们按照原顺序抄袭一下即可,无需其他操作。

其次,中间的反转环节,我们参照(copy)之前的那道题即可;

最后,我们拼凑一下即可,注意移动 p1 指针到尾部再进行拼接。

/**
 * 以下方法自己编写,复制发布博客等请注明出处 https://blog.csdn.net/smileyan9
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        // 最终答案链表
        ListNode* list1 = new ListNode();
        ListNode* p1 = list1;
        ListNode* start = head;
        // 复制left部分        
        for (int i = 0; i < left - 1; i++) {
            p1 -> next = start;
            p1 = p1 -> next;
            start = start -> next;
        }

        // 反转中间的部分
        ListNode* p2 = nullptr;
        for (int i = left - 1; i < right; i++) {
            ListNode* next = start -> next;
            start -> next = p2;
            p2 = start;
            start = next;
        }

        // 复制right部分
        p1 -> next = p2;
        while (p1 -> next) {
            p1 = p1 -> next;
        }
        p1 -> next = start;

        return list1 -> next;
    }
};

趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)

时间复杂度:O(n)
空间复杂度:O(1)

2. 分隔链表

问题描述

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

示例 1

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2

输入:head = [2,1], x = 2
输出:[1,2]

问题分析

首先推荐尝试一下不考虑空间复杂度的做法,也就是先新建两个链表,每次都 new Node 来创建新的结点并添加到链表中。这种方法比较简单易懂。

接着我们看看如果不创建新的空间应该怎么做,以下代码来自力扣的官方网站答题,比较简单明了。

重点在于循环中的内容,每次判断完大小以后,分别添加到两个链表中,注意这里没有新建空间,而是直接用 next 指针指向它。

另外就是头结点的使用非常关键,head 的作用在最后拼接的时候体现出来。

/**
 * 以下源码来自力扣官网:https://leetcode.cn/problems/partition-list/submissions/
 */ 
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* small = new ListNode(0);
        ListNode* smallHead = small;
        ListNode* large = new ListNode(0);
        ListNode* largeHead = large;
        while (head != nullptr) {
            if (head -> val < x) {
                small -> next = head;
                small = small -> next;
            } else {
                large -> next = head;
                large = large -> next;
            }
            head = head->next;
        }
        large -> next = nullptr;
        small -> next = largeHead -> next;
        return smallHead -> next;
    }
};

3. 总结

本节介绍链表的两个中等难度的题解,通过这两道题应该清楚链表的基本操作,比如什么时候该 next 移动,什么时候借助中间的 tmp 记录一下 next 完成操作以后再 :“指回来”。

Smileyan
2023.04.30 17:21文章来源地址https://www.toymoban.com/news/detail-430327.html

到了这里,关于趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 《数据结构》实验报告二:顺序表 链表

    1、掌握线性表中元素的 前驱、后续 的概念。 2、掌握顺序表与链表的 建立 、 插入 元素、 删除 表中某元素的算法。 3、对线性表相应算法的 时间复杂度 进行分析。 4、理解顺序表、链表数据结构的特点( 优缺点 )。 说明以下概念 1、线性表:         具有 相同特性 的数

    2024年02月08日
    浏览(29)
  • 数据结构2:顺序表和链表

    目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 2.3数据相关面试题 2.4顺序表的问题及思考 3.链表 3.1链表的概念及结构 3.2链表的分类 3.3链表的实现 3.4链表面试题 3.5双向链表的实现 4.顺序表和链表的区别 线性表(linear list)是具有相同特征的数据元素的有限序列。线性表是

    2023年04月17日
    浏览(30)
  • 数据结构(二)----线性表(顺序表,链表)

    目录 1.线性表的概念 2.线性表的基本操作 3.存储线性表的方式 (1)顺序表 •顺序表的概念 •顺序表的实现 静态分配: 动态分配: 顺序表的插入: 顺序表的删除: 顺序表的按位查找: 顺序表的按值查找: 顺序表的特点: (2)单链表 •单链表的实现 不带头结点的单链表

    2024年04月16日
    浏览(43)
  • <数据结构> 链表 - 小练习

    线性表在 ▁▁▁▁ 情况下适合采用链式存储结构。 A.线性表中数据元素的值需经常修改 B.线性表需经常插入或删除数据元素 C.线性表包含大量的数据元素 D.线性表的数据元素包含大量的数据项 链表要求内存中可用存储单元的地址 ▁▁▁▁▁ 。 A.必须是连续的 B.部分地址必

    2023年04月08日
    浏览(16)
  • 常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)

    线性表(Linear List)     1.什么是线性表     2.线性表的特点     3.线性表的基本运算 顺序表     1.什么是顺序表     2.时间复杂度: 链表     1.什么是链表     2.单向链表     3. 双向链表     4.ArrayList和LinkedList的使用 栈Stack     1.什么是栈     2.栈的基本方法 队列Queue

    2024年02月13日
    浏览(28)
  • 数据结构顺序表和链表(超详细)

    线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构, 常见的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在

    2024年02月13日
    浏览(31)
  • 数据结构:2_顺序表和链表

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构, 常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的 ,线性表在物理上

    2024年01月18日
    浏览(35)
  • 数据结构,队列,顺序表队列,链表队列

            队列是一种常见的数据结构,它具有先进先出(First-In-First-Out,FIFO)的特性,类似于排队等候的场景。以下是队列的要点: 1. 定义:队列是一种线性数据结构,由一系列元素组成,可以进行插入和删除操作。插入操作(称为入队)只能在队列的末尾进行,删除操

    2024年02月11日
    浏览(27)
  • 初阶数据结构:顺序表相关题目练习

    在对顺序表这一数据结构进行了学习与自实现后,我明白了顺序表的是使用了 物理地址上连续的数组模型 实现的,而 插入删除 的操作都会涉及到其中 数据的挪动与边界问题 。接下来,就结合算法时空间复杂的要求来对这一相关问题通过几道题目进行巩固练习。 题目要求:

    2024年01月20日
    浏览(36)
  • 数据结构奇妙旅程之顺序表和链表

    ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶ 个人主页:xiaoxieʕ̯

    2024年02月05日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包