数组与链表

35 篇文章 0 订阅
订阅专栏

数组原理、实战应用

  • C++: int a[100];
  • Java: int[] a = new int[100];
  • Python:a=[]
  • 数组的基本特点:支持随机访问
  • 数组的关键:索引与寻址
  • C++: a[i], *(a+i)
  • Java, Python: a[i]
  • 数组在内存中是–段连续的存储空间

在这里插入图片描述

数组-插入元素

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

数组-删除元素

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

时间复杂度

在这里插入图片描述

实战

26.删除有序数组中的重复项
https://leetcode.cn/problems/remove-duplicates-from-sorted-array/

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int fast = 1, slow = 1;
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
};

283.移动零

https://leetcode.cn/problems/move-zeroes/

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size(), left = 0, right = 0;
        while (right < n) {
            if (nums[right]) {
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
    }
};

88.并两个有序数组
https://leetcode.cn/problems/merge-sorted-array/

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for(int i=0;i<n;i++)
        {
            nums1[m+i]=nums2[i];
        }

        sort(nums1.begin(),nums1.end());
    }
};
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        // for(int i=0;i<n;i++)
        // {
        //     nums1[m+i]=nums2[i];
        // }

        // sort(nums1.begin(),nums1.end());

        int pos=m-- + n-- -1;
        while(m>=0 && n>=0)
        {
            nums1[pos--]=nums1[m]>nums2[n]?nums1[m--]:nums2[n--];
        }

        while(n>=0)
        {
            nums1[pos--]=nums2[n--];
        }
    }
};
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int p1 = m - 1, p2 = n - 1;
        int tail = m + n - 1;
        int cur;
        while (p1 >= 0 || p2 >= 0) {
            if (p1 == -1) {
                cur = nums2[p2--];
            } else if (p2 == -1) {
                cur = nums1[p1--];
            } else if (nums1[p1] > nums2[p2]) {
                cur = nums1[p1--];
            } else {
                cur = nums2[p2--];
            }
            nums1[tail--] = cur;
        }
    }
};

设计变长数组

  • C++: vector
  • Java: ArrayList
  • Python: list

如何实现一个变长数组?

  • 支持索引与随机访问
  • 分配多长的连续空间?
  • 空间不够用了怎么办?
  • 空间剩余很多如何回收?

一个简易的实现方法

  • 初始:空数组,分配常数空间,记录实际长度(size) 和容量(capacity)
  • Push back:若空间不够,重新申请2倍大小的连续空间,拷贝到新空间,释放旧空间
  • Pop back:若空间利用率(size/capacity) 不到25%,释放一半的空间
  • 均摊0(1)
  • 在空数组中连续插入n个元素,总插入/拷贝次数为n+n/2+n/4+…< 2n
  • 一次扩容到下一次释放,至少需要再删除n- 2n*0.25=0.5n次

思考:若释放空间的阈值设定为50%,会发生什么情况?

链表原理讲解、实战应用

单链表(linked list)

在这里插入图片描述

单链表-插入

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

单链表-删除

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

双链表(double linked list)

在这里插入图片描述

时间复杂度

在这里插入图片描述

保护节点

在这里插入图片描述

实战

206.反转链表
https://leetcode.cn/problems/reverse-linked-list/

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr) {
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};

25. K个一组翻转链表
https://leetcode.cn/problems/reverse-nodes-in-k-group/

class Solution {
public:
    // 翻转一个子链表,并且返回新的头与尾
    pair<ListNode*, ListNode*> myReverse(ListNode* head, ListNode* tail) {
        ListNode* prev = tail->next;
        ListNode* p = head;
        while (prev != tail) {
            ListNode* nex = p->next;
            p->next = prev;
            prev = p;
            p = nex;
        }
        return {tail, head};
    }

    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* hair = new ListNode(0);
        hair->next = head;
        ListNode* pre = hair;

        while (head) {
            ListNode* tail = pre;
            // 查看剩余部分长度是否大于等于 k
            for (int i = 0; i < k; ++i) {
                tail = tail->next;
                if (!tail) {
                    return hair->next;
                }
            }
            ListNode* nex = tail->next;
            // 这里是 C++17 的写法,也可以写成
            // pair<ListNode*, ListNode*> result = myReverse(head, tail);
            // head = result.first;
            // tail = result.second;
            tie(head, tail) = myReverse(head, tail);
            // 把子链表重新接回原链表
            pre->next = head;
            tail->next = nex;
            pre = tail;
            head = tail->next;
        }

        return hair->next;
    }
};

141.环形链表

https://leetcode.cn/problems/linked-list-cycle/

  • 快慢指针法, 0(length) 时间,0(1) 空间
  • 有环必定发生套圈(快慢指针相遇),无环不会发生套圈(快指针到达null)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* fast = head;
        while(fast != nullptr && fast->next != nullptr) {
            fast = fast->next->next;
            head = head->next;
            if(fast == head) return true;
        }

        return false;
    }
};

142.环形链表II

在这里插入图片描述

  • 相遇时,有2(l+p)=l+p+k*r,其中k为整数(套的圈数)
  • 即l=kr-p=(k-1) r+(r-p)
  • 含义:从head走到st,等于从meet走到st,然后再绕几圈
  • 此时开始让慢指针与head同时移动,必定在环的起始点相遇
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != nullptr && fast->next != nullptr) {
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow) {
                while (head != slow ) {
                    head = head->next;
                    slow = slow->next;
                }
                return head;
            }
        }
        return nullptr;
    }
};

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家: Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

数组链表的优缺点
蔚成风
08-23 6138
数组链表的优缺点
leetcode学习记录_链表
timathy33的博客
04-11 149
链表 剑指 Offer 24. 反转链表 迭代: class Solution { public: ListNode* reverseList(ListNode* head) { ListNode* after = head , *before = nullptr; while(after != nullptr) { ListNode* t; t = after->next; after->next = before; before = after..
链表经典题:K个一组翻转链表
后台开发
11-02 461
//K个一组翻转链表 class Solution { public: // 翻转一个子链表,并且返回新的头与尾 pair<ListNode*, ListNode*> myReverse(ListNode* head, ListNode* tail) { ListNode* prev = tail->next; ListNode* p = head; while (prev != tail) { ...
万字长文一网打尽链表翻转相关技巧(挑战字节hard面试题)
清风微浪又何妨的博客
12-05 430
链表高频热门翻转题型+个人心法,适合有基础者配合LeetCode平台刷题时阅读。翻过这道槛,链表专题可以基本告一段落。
C++ | Leetcode C++题解之第25题K个一组翻转链表
Ddddddd_158的博客
04-13 472
C++ | Leetcode C++题解之第25题K个一组翻转链表
链表排序:快速排序、归并排序
qq_40586164的博客
08-06 202
快速排序 非交换节点值 【思路】 链表快排与普通快排的不同首先在于链表无法直接swap,因此使用leetcode86题的双指针方法实现partition。 其次,因为排序后首尾节点会变化,所以需要记录新的首节点。 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} ListNode(int x,ListNode* p) : val(x), next(p) {
c语言数组链表转化-分别用数组链表实现堆栈(C语言版)(转) 数组链表.pdf
04-18
"c语言数组链表转化-分别用数组链表实现堆栈(C语言版)" 本资源主要讲解了使用C语言实现堆栈的两种方法:使用数组链表。堆栈是一种常用的数据结构,它可以用来实现递归算法、表达式求值、语法分析等。 第一...
php数组链表的区别总结
10-16
链表中的每个元素都通过指针与其他元素连接,不需要移动其他元素即可完成插入和删除,但这也意味着通过下标直接访问链表中的元素是不可能的,必须从链表的头元素开始,按照指针逐一访问。 在内存存储方面,PHP数组...
数组链表深度解析:性能、应用与选择策略
06-23
数组链表作为两种基础的线性数据结构,在实际编程中有着广泛的应用。本文将深入探讨数组链表的内部机制、性能特点、适用场景以及它们在现代编程语言中的实现方式。 数组链表各有优势和局限,它们在不同的应用...
[数据结构]数组链表的优缺点和区别 数组链表.pdf
04-18
数组链表是两种基本的数据结构,它们各自有其独特的优缺点,适用于不同的场景。下面将详细介绍这两种数据结构以及它们的区别。 首先,数组是一种线性数据结构,它将元素在内存中连续存放,每个元素占用相同的内存...
(每日一练C++)25. K 个一组翻转链表
weixin_39827856的博客
06-20 208
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5] 来源:力扣(LeetCo.
面试12之给定两个链表ListNode* A,ListNode* B,请返回A+B的结果
hj605635529的博客
04-23 5521
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。 测试样例: {1,2,3},{3,2,1} 返回:{4,4,4} 本题的思路很简单,按照小学数学中学习的加法原理从末尾到首位,对每一位
链表ListNode详细解释
热门推荐
不二青衣的博客
06-06 3万+
ListNodeLeetCode碰到一个简单链表题,题目已经定义了链表节点ListNode,作者很菜,好多忘了,把ListNode又查了一下 struct ListNode { int val; //定义val变量值,存储节点值 struct ListNode *next; //定义next指针,指向下一个节点,维持节点连接 } · 在节点ListNode定义中,定义为节点为结构变量。 · 节点存储了两个变量:value 和 next。value 是这个节点的
LeetCode:Reverse Nodes in k-Group
weixin_34384557的博客
11-08 56
Given a linked list, reverse the nodes of a linked listkat a time and return its modified list. If the number of nodes is not a multiple ofkthen left-out nodes in the end sh...
链表数组
Ydi1115的博客
11-25 1422
作为线性表的两种存储方式 —— 链表数组,这对相爱相杀的好基友有着各自的优缺点。接下来,我们梳理一下这两种方式。 链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素; 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:**一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 ** 1.单向链表 单向链表包含两个域
leetcode389:赎金信
D2510466299的博客
10-20 553
ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。
Leetcode 最小路径和
985小菜鸡
10-20 308
这段代码解决的是LeetCode第64题“最小路径和”,其核心思想是(Dynamic Programming,简称DP)。
leetcode153. Find Minimum in Rotated Sorted Array
最新发布
weixin_44245188的博客
10-23 80
【代码】leetcode153. Find Minimum in Rotated Sorted Array。
Leetcode 721. 账户合并
m0_51437455的博客
10-18 957
请注意,即使两个账户具有相同的名称,它们也可能属于不同的人,因为人们可能具有相同的名称。给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址。合并账户后,按以下格式返回账户:每个账户的第一个元素是名称,其余元素是 按字符 ASCII 顺序排列 的邮箱地址。第一步,构建email->username的映射,同时构建邮箱之间的并查集(同一个账户的邮箱属于一个集合)
写文章

热门文章

  • Docker镜像编译与Docker-Compose部署与编排 7335
  • IM即时通讯项目框架分析 7170
  • nginx过滤器模块 5693
  • skynet设计原理 4599
  • tcp支持浏览器websocket协议 4560

分类专栏

  • # 03.2.3 同步与互斥 8篇
  • 第二章进程与线程 22篇
  • 操作系统 33篇
  • 处理机调度 7篇
  • 进程与线程 7篇
  • 虚拟机 1篇
  • 操作系统引导 1篇
  • 操作系统结构 2篇
  • 操作系统概述 8篇
  • 操作系统运行环境 4篇
  • 一战成硕 3篇
  • linux存储 12篇
  • 算法刷题 35篇
  • Redis源码剖析 3篇
  • Redis事件驱动框架 3篇
  • 零声学院Linux c++ 28篇
  • 面试简历 13篇
  • 笔记 24篇
  • Linux内核源码 3篇
  • 服务器开发 7篇
  • Javaweb 1篇
  • 设计模式 11篇

最新评论

  • CHS_02.2.2.2+调度的目标 调度算法的评价指标

    m0_68949064: 优质好文,博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,文章思路清晰,图文并茂,详略得当,三连支持,期待博主持续输出好文。

  • CHS_03.1.3.3+系统调用

    白话机器学习: 文章写得专业、深入、详细,收藏啦

  • 存储性能软件加速库(SPDK)

    CSDN-Ada助手: 非常感谢博主分享有关存储性能软件加速库(SPDK)的知识!创作一篇优质的博客不易,博主的分享对读者来说非常有价值。下一篇博客可以分享有关多线程编程或者高性能计算的话题,让读者更深入了解相关知识。

  • NVMf RPC接口文件 nvmf_rpc.c

    EmotionFlying: NVMf RPC接口文件 nvmf_rpc.c,内容很精彩,感谢博主的分享。表情包

  • 即时通讯项目(一)

    老铁Infi: 老哥求一份源码

最新文章

  • CHS_09.2.3.6_2+多生产者-多消费者
  • CHS_08.2.3.6_1+生产者-消费者问题
  • CHS_06.2.3.4_2+用信号量实现进程互斥、同步、前驱关系
2024年33篇
2023年18篇
2022年68篇
2021年35篇
2020年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我也要当昏君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家兰溪玻璃钢雕塑联系电话南阳玻璃钢雕塑铸造工艺玻璃钢花盆座椅价格镜面校园玻璃钢雕塑定做价格泰安小区玻璃钢雕塑安装奥体商场活动美陈蒙自玻璃钢雕塑厂家玻璃钢雕塑后期维护上海主题商场美陈当代玻璃钢雕塑方法佛山商场美陈卡通雕塑富阳区玻璃钢雕塑企业青浦区玻璃钢雕塑设计玻璃钢熊猫雕塑工程苏州玻璃钢雕塑制作商嘉兴专业玻璃钢雕塑商场水沿上面美陈主题玻璃钢雕塑加工价格万安玻璃钢雕塑厂家黑龙江欧式玻璃钢雕塑生产厂家湖南仿铜玻璃钢雕塑订做价格奉贤玻璃钢卡通雕塑港粤玻璃钢雕塑湖北不锈钢人物玻璃钢景观雕塑玻璃钢树池玻璃钢雕塑的特性日照玻璃钢雕塑哪家好合肥时尚玻璃钢面包雕塑郑州泡沫玻璃钢卡通雕塑定制北京玻璃钢雕塑摆件费用香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化