算法题② —— 链表专栏

1. 链表数据结构

struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}};

2. 链表的删除

2.1 移除链表元素

  • 力扣:https://leetcode.cn/problems/remove-linked-list-elements/description/
ListNode* removeElements(ListNode* head, int val) {if(head == NULL) return NULL;ListNode *dummy= new ListNode(-1);dummy->next = head;ListNode *pre = dummy;ListNode *cur = head;while(cur){if(cur->val == val){ListNode *tmp = cur->next;pre->next = tmp;delete(cur);cur = tmp;}else{pre = cur;cur = cur->next;}}return dummy->next;
}

2.2 删除链表的倒数第N个节点

  • 力扣:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyHead = new ListNode(-1);dummyHead->next = head;ListNode* slow = dummyHead;ListNode* fast = dummyHead;while(n-- && fast) {fast = fast->next;}fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点while (fast) {fast = fast->next;slow = slow->next;}slow->next = slow->next->next; ListNode *tmp = slow->next;slow->next = tmp->next;delete tmp;return dummyHead->next; 
}

3. 链表的移动

3.1 反转链表

  • 力扣:https://leetcode.cn/problems/reverse-linked-list/description/
ListNode* reverseList(ListNode* head) {if(head == NULL) return NULL;if(head->next == NULL) return head;ListNode *pre = NULL;ListNode *cur = head;while(cur){ListNode *tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;
}

3.2 两两交换链表节点

  • 力扣:https://leetcode.cn/problems/swap-nodes-in-pairs/description/
ListNode* swapPairs(ListNode* head) {if(head == NULL) return NULL;if(head->next == NULL) return head;ListNode *dummy = new ListNode(-1);dummy->next = head;ListNode *pre = dummy;ListNode *cur = head;while(cur && cur->next){ListNode *tmp = cur->next;cur->next = tmp->next;tmp->next = cur;pre->next = tmp;pre = cur;cur = cur->next;}return dummy->next;
}

3.3 反转链表的一部分

  • 力扣:https://leetcode.cn/problems/reverse-linked-list-ii/description/
ListNode *reverseBetween(ListNode *head, int left, int right) {ListNode *dummy = new ListNode(-1);dummy->next = head;ListNode *pre = dummy;// 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点for (int i = 0; i < left - 1; i++) {pre = pre->next;}// 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点ListNode *rightNode = pre;for (int i = 0; i < right - left + 1; i++) {rightNode = rightNode->next;}// 第 3 步:切断出一个子链表(截取链表)ListNode *leftNode = pre->next;ListNode *curr = rightNode->next;pre->next = nullptr;rightNode->next = nullptr;// 第 4 步:同上一题,反转链表的子区间reverseLinkedList(leftNode);// 第 5 步:接回到原来的链表中pre->next = rightNode;leftNode->next = curr;return dummy->next;
}

3.4 K个一组反转链表

  • 力扣:https://leetcode.cn/problems/reverse-nodes-in-k-group/description/
ListNode* reverseKGroup(ListNode* head, int k) {ListNode *dummy = new ListNode(-1);dummy->next = head;         ListNode *left = head;       //每组的第一个ListNode *right = dummy;     //每组的第k个,初始为left的前一个节点ListNode *beforePre = dummy; //反转前本组的前驱while(left){for(int i = 0; i < k; ++i){if(right->next) right = right->next;else return dummy->next;  //不足k个结点,反转结束}ListNode *beforeNext = right->next; //即为下一组的leftListNode *pre = nullptr;ListNode *cur = left;while(pre != right){ListNode *tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}beforePre->next = right;left->next = beforeNext;right = left;beforePre = left;left = beforeNext;}return dummy->next;
}

3.5 旋转链表

  • 力扣:https://leetcode.cn/problems/rotate-list/description/

3.6 分隔链表

  • 力扣:https://leetcode.cn/problems/partition-list/description/

4. 链表的相交

4.1 链表相交

  • 力扣:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode* curA = headA;ListNode* curB = headB;int lenA = 0, lenB = 0;while (curA) { lenA++;curA = curA->next;}while (curB) { lenB++;curB = curB->next;}curA = headA;curB = headB;int gap = 0;if (lenB > lenA) {gap = lenB -lenA;while(gap--) curB = curB->next;}else{ gap = lenA - lenB;while (gap--) curA = curA->next;}while (curA) {if (curA == curB) return curA;curA = curA->next;curB = curB->next;}return NULL;
}

4.2 合并链表

  • 力扣:https://leetcode.cn/problems/merge-two-sorted-lists/description/

4.3 环形链表

  • 力扣:https://leetcode.cn/problems/linked-list-cycle-ii/description/
ListNode *detectCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast && fast->next) {slow = slow->next;fast = fast->next->next;if (slow == fast) {ListNode* index1 = fast;ListNode* index2 = head;while (index1 != index2) {index1 = index1->next;index2 = index2->next;}return index2; // 返回环的入口}}return NULL;
}
  • 判断环入口的方法:
    • 相遇时,slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z)
    • 因为fast指针是一步走两个节点,slow指针一步走一个节点, 所以 (x + y) * 2 = x + y + n (y + z),得到 x = n (y + z) - y
    • 整理公式之后为如下公式:x = (n - 1) (y + z) + z
    • n = 1 时,得到 x = z,这就意味着:从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点

在这里插入图片描述

5. 其他

5.1 LRU缓存(链表常考题)

  • 力扣:https://leetcode.cn/problems/lru-cache/description/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引擎:主程渲染

一、引擎发展 二、引擎使用 1.游戏渲染流程 2.3D场景编辑器操作与快捷键 3.节点的脚本组件 脚本介绍 引擎执行流程 物体节点、声音组件\物理组件\UI组件、脚本组件 暴露变量到面板 4.节点的查找 基本查找 this.node&#xff1a;挂载当前脚本的节点A&#xff1b; this.nod…

一、精准化测试介绍

精准化测试介绍 一、精准化测试是什么&#xff1f;二、什么是代码插桩&#xff1f;三、两种插桩方式Offine模式&#xff1a;On-the-fly插桩: 四、jacoco覆盖率报告展示五、增量代码覆盖率监控原理六、精准测试系统架构图七、全量与增量覆盖率报告包维度对比八、全量与增量覆盖率…

牛客NC343 和大于等于K的最短子数组【困难 前缀和 Java/Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/3e1fd3d19fb0479d94652d49c7e1ead1 思路 本答案利用前缀和解答&#xff0c;Java&#xff0c;Go答案通过&#xff0c;但是同样的代码用PHP的话有一个测试用例超时 应该还有更优秀的答案&#xff0c;后面找到更优…

2022——蓝桥杯十三届2022国赛大学B组真题

问题分析 看到这个问题的同学很容易想到用十层循环暴力计算&#xff0c;反正是道填空题&#xff0c;一直算总能算得出来的&#xff0c;还有些同学可能觉得十层循环太恐怖了&#xff0c;写成回溯更简洁一点。像下面这样 #include <bits/stdc.h> using namespace std; in…

apk反编译修改教程系列-----反编译apk 去除软件强制更新的八种方式步骤解析【十七】

安卓有的apk 软件会不断更新。但有些用户需要旧版的有些功能或者新版功能增减原因等等。需要不更新继续使用。这类问题有的可以简单修改版本号来跳过更新。或者有的软件可以忽略。但对于某些无法跳过更新界面等等的apk。就需要深度反编译来去除软件的强制更新。 通过课程可以了…

wsl安装Xfce桌面并设置系统语言和输入法

一、安装xfce &#xff08;有相关的依赖都会安装&#xff09; sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务&#xff1a; sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…

1067: 有向图的邻接表存储强连通判断

解法&#xff1a; 定理&#xff1a;有向图G是强连通图的充分必要条件是G中存在一条经过所有节点的回路 跟上道题一样 这是错误代码 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& a,int u) {a…

唤醒手腕 Go 语言 并发编程、Channel通道、Context 详细教程(更新中)

并发编程概述 ​ 一个进程可以包含多个线程&#xff0c;这些线程运行的一定是同一个程序&#xff08;进程程序&#xff09;&#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位&#xff0c;线程是调度运行的基本单位&#xff0c…

【JAVA进阶篇教学】第十二篇:Java中ReentrantReadWriteLock锁讲解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十二篇&#xff1a;Java中ReentrantReadWriteLock锁讲解。 在并发编程中&#xff0c;读写锁&#xff08;ReadWriteLock&#xff09;是一种用于管理对共享资源的访问的锁机制&#xff0c;它提供了比传统的互斥锁更高的…

栈的讲解

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底&#xff08;因为先进后出&#xff09;。栈中的数据元素遵守后进先出LIFO&#xff08;Last In Firs…

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想&#xff0c;它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#x…

函数模板底层本质

#include<iostream> using namespace std;template<typename T1> T1 ave(T1 a, T1 b) { return a b; }int main() {ave(100, 200);ave(short(100), short(200));return 0; }反汇编代码 模板本质是编译器帮忙生成了不同的函数 就算非类型参数值不一样编译器也重新…

HCIP(BGP综合实验)--8

一&#xff1a;实验要求 二&#xff1a;实现过程 &#xff08;一&#xff09;配置IP地址&#xff1a; AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […

TM1650 并联在I2C 信号线的处理方法

目的是可以并联多个TM1650 在标准I2C 总线上&#xff0c;并且不影响其他标准I2C 器件。思路就是拿个额外的开关控制每一片TM1650 的使能&#xff0c;就像SPI 的CS 信号那样。 协议 TM1650 的通信协议虽说不是标准I2C&#xff0c;但也算是比较兼容的&#xff0c;比方说&#x…

springboot实现Aop

一、原理 AOP&#xff08;Aspect Oriented Programming&#xff09;的意思是&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可对业务逻辑进行增强&#xff0c;在不改变原有逻辑的基础上&#xff0c;在其前后进…

YOLOv8独家原创改进: AKConv(可改变核卷积)

1.AKConv原理介绍 地址:2311.11587 (arxiv.org) 摘要:基于卷积运算的神经网络在深度学习领域取得了令人瞩目的成果,但标准卷积运算存在两个固有的缺陷。一方面,卷积运算仅限于局部窗口,无法捕获其他位置的信息, 并且它的采样形状是固定的。 另一方面,卷积核的大小固定为…

基于yolov8+gradio目标检测演示系统设计

YOLOv8与Gradio&#xff1a;开启目标检测的可视化新篇章 随着人工智能技术的飞速发展&#xff0c;目标检测作为计算机视觉领域的重要分支&#xff0c;已经广泛应用于安防监控、自动驾驶、医疗影像等多个领域。而YOLO&#xff08;You Only Look Once&#xff09;系列算法作为目…

Maven多环境与SpringBoot多环境配置

1. Maven多环境配置与应用 1.1 多环境开发 我们平常都是在自己的开发环境进行开发&#xff0c; 当开发完成后&#xff0c;需要把开发的功能部署到测试环境供测试人员进行测试使用&#xff0c; 等测试人员测试通过后&#xff0c;我们会将项目部署到生成环境上线使用。 这个时…

Unity曲线插件Dreamteck Splines生成曲线Mesh

一、需求 脱离编辑器&#xff0c;运行时添加点&#xff0c;动态生成管道、线缆等曲线Mesh。 二、Dreamteck Splines简单运用 这方面资料不多&#xff0c;只有官方文档全英参考&#xff0c;而且又介绍得不详细。 2个重要组件介绍&#xff1a; SplineComputer&#xff1a; 最…

yum、rpm相关命令-工具手册

1.rpm文件: 1.1安装rpm文件: rpm -ivh kde-select.rpm23 #--nodeps强制安装,无视环境缺少依赖的检查 rpm -ivh --nodeps kde-select.rpm #--force --replacefiles可以无视rpm的冲突去强制替换(如两个rpm的安装路径相同了会有冲突) rpm -ivh --nodeps --force --replacef…