代码随想录:链表

移出链表元素

lc203.移除链表元素

  • 题目lc203
  • 思路:注意这里的头节点也有val,所以分两种情况,头节点和非头结点
  • 代码如下:
/*** Definition for singly-linked list.* 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) {}* };*/
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {// 如果为空,直接返回if(head == nullptr){return head;}ListNode* temp;// 如果头节点是valwhile(head && head->val == val){temp = head;head = head->next;delete(temp);}// 如果非头节点是valtemp = head;ListNode* before_temp = head;  // 指向temp的前一个节点while(before_temp && before_temp->next != nullptr){if(temp->val == val){before_temp->next = temp->next;delete(temp);temp = before_temp;}before_temp = temp;temp = temp->next;}return head;}
};
  • 看了官方题解,思路:先加入一个头节点,这样每个节点的操作都一样
  • 代码如下:
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* new_head = new ListNode(0, head);ListNode* temp = new_head;while(temp->next){if(temp->next->val == val){ListNode* delete_node = temp->next;temp->next = delete_node->next;delete(delete_node);} else{temp = temp->next;}}return new_head->next;}
};

lc206 反转链表

  • 题目lc206
  • 思路:三个指针,一个指向前一个节点,一个指向当前节点,一个指向后一个节点
  • 代码如下:
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* pre = nullptr, *cur = head;ListNode* temp = nullptr;while(cur != nullptr){temp = cur->next;cur->next = pre;// 向后移动pre = cur;cur = temp;}return pre;}
};

lc24. 两两交换链表中的节点

  • 题目lc24
  • 同上,用三个指针交换,加入头节点,详细思考过程见代码
  • 代码如下:
class Solution {
public:ListNode* swapPairs(ListNode* head) {// 先分析中间节点如何两两交换:改变3个指针,如样例234(交换34)// 指针变化为:3->next(4), 4->3, 2->4// 考虑第一个节点,不需要类似2->4的指针变化,为了每个节点都用一样的操作,加一个dummy_headif(head == nullptr){return nullptr;}ListNode* dummy_head = new ListNode(-1, head);ListNode* pre = dummy_head, * cur = head, *next = head->next;while(cur && next){// 三个指针变化cur->next = next->next;next->next = cur;pre->next = next;// 向后移动pre = cur;cur = cur->next;if(cur != nullptr){next = cur->next;}}return dummy_head->next;}
};

lc19. 删除链表的倒数第 N 个结点

  • 题目lc19
  • 思路和代码如下:
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {// 为了保证头节点操作相同,加入dummy_head// 设链表长度为x + 1, 删除倒数第n个节点,即正数第(x + 1 - n + 1)个节点// 快慢指针:快指针先走(n + 1)个节点,然后快慢指针同时移动// 当快指针 == nullptr,慢指针就移动了(x - n + 1)个节点,到达删除节点的前一个节点// 最后进行删除操作ListNode* dummy_head = new ListNode(-1, head);ListNode* fast = dummy_head->next, *slow = dummy_head;for(int i = 0; i < n; i++){fast = fast->next;}while(fast){fast = fast->next;slow = slow->next;}slow->next = slow->next->next;  // 忽略了delete操作return dummy_head->next;}
};

面试题 02.07. 链表相交

  • 题目lc02.07
  • 思路和代码如下:
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 先分别计算两个链表的长度,再让长链表移动使得两个链表长度相同// 最后同时移动两个链表,直到相交或结尾if(headA == nullptr || headB == nullptr){return NULL;}int lenA = 0, lenB = 0;ListNode* temp = headA;while(temp != nullptr){lenA++;temp = temp->next;}temp = headB;while(temp != nullptr){lenB++;temp = temp->next;}// 移动长链表while(lenA > lenB){lenA--;headA = headA->next;}while(lenB > lenA){lenB--;headB = headB->next;}// 同时移动两个链表while(headA != nullptr && headB != nullptr){if(headA == headB){return headA;}headA = headA->next;headB = headB->next;}return NULL;}
};

lc142. 环形链表 II

  • 题目lc142
  • 思路
    • 先通过快慢指针找到相遇点:快指针向前走2步,慢指针每次走一步,如果有环总会相遇,如果fast为空则没有环
    • 再通过双指针找到入口点:这里需要一些简单的数学推导,设head到入口点距离为x,我们用p指针从head走到入口节点;设入口节点到相遇点(用q指针)距离为y,相遇点到入口点距离为z;两条约束式,slow走的距离:x + y,fast距离:x + y + n(y + z),因为多走n圈;第二条约束式:slow距离 * 2 = fast距离;最后得出x = (n - 1)(y + z) + z,用代码实现就是q指针从fast和slow相遇点出发,走n圈以及z的距离,就会和p指针从head出发在入口节点相遇
  • 代码如下:
class Solution {
public:ListNode *detectCycle(ListNode *head) {// 判断有没有环ListNode* fast = head, *slow = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;if(fast == slow){// 找到环的第一个节点ListNode *p = head, *q = fast;while(p != q){p = p->next;q = q->next;}return p;}}return NULL;}
};

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

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

相关文章

蓝桥杯第17169题——兽之泪II

问题描述 在蓝桥王国&#xff0c;流传着一个古老的传说&#xff1a;在怪兽谷&#xff0c;有一笔由神圣骑士留下的宝藏。 小蓝是一位年轻而勇敢的冒险家&#xff0c;他决定去寻找宝藏。根据远古卷轴的提示&#xff0c;如果要找到宝藏&#xff0c;那么需要集齐 n 滴兽之泪&#…

go | 切片的长度和容量

其实这也不算什么重难点了&#xff0c;只是想想&#xff0c;也就记录下来吧。对了&#xff0c;有一段时间没在这上面更了然后那个排名就有点在掉&#xff0c;感觉这个机制不太好&#xff0c;更过于频繁很可能只是写流水账&#xff0c;内容质量会大打折扣 好的&#xff0c;我们步…

Git | 分支管理

Git | 分支管理 文章目录 Git | 分支管理1、理解分支2、创建分支&&切换分支3、合并分支4、删除分支5、合并冲突6、分支管理策略合并分支模式实际工作中分支策略bug分支删除临时分支 1、理解分支 分支就类似分身。 在版本回退中&#xff0c;每次提交Git都会将修改以git…

asio之地址

address address作为address_v4和address_v6的包装器 #mermaid-svg-XZWMK64K5NucyHdI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XZWMK64K5NucyHdI .error-icon{fill:#552222;}#mermaid-svg-XZWMK64K5NucyHdI …

简单学量化——pandas的应用26——sort_values函数5

简单学量化——pandas的应用26——sort_values函数5 sort_values是pandas中的排序函数&#xff0c;语法如下&#xff1a; DataFrame.sort_values(by,axis0,ascendingTrue,inplaceFalse,kindquicksort,na_positionlast, ignore_indexFalse,keyNone) 前面我们学习了by、axis、a…

C++之写时复制(CopyOnWrite)

设计模式专栏&#xff1a;http://t.csdnimg.cn/4j9Cq 目录 1.简介 2.实现原理 3.QString的实现分析 3.1.内部结构 3.2.写入时复制 4.示例分析 5.使用场景 6.总结 1.简介 CopyOnWrite (COW) 是一种编程思想&#xff0c;用于优化内存使用和提高性能。COW 的基本思想是&am…

go的编译以及运行时环境

开篇 很多语言都有自己的运行时环境&#xff0c;go自然也不例外&#xff0c;那么今天我们就来讲讲go语言的运行时环境&#xff01; 不同语言的运行时环境对比 我们都知道Java的运行时环境是jvm &#xff0c;javascript的运行时环境是浏览器内核 Java -->jvm javascript…

postgresql 存储过程 批量插入(根据插入的值 动态判断需要插入的字段) 以及 批量更改(根据更改的值 动态判断需要更改的字段)

postgresql 存储过程 循环插入 根据插入的值判断插入相应的字段 在PostgreSQL中&#xff0c;您可以使用PL/pgSQL语言编写函数&#xff0c;该函数可以在循环中执行插入操作&#xff0c;并根据插入的值判断应该插入哪些字段。但是&#xff0c;请注意&#xff0c;PostgreSQL通常不…

FastWiki一分钟本地离线部署本地企业级人工智能客服

介绍 FastWiki是一个开源的企业级人工智能客服系统&#xff0c;它使用了一系列先进的技术和框架来支持其功能。 技术栈 前端框架&#xff1a;React LobeUI TypeScript后端框架&#xff1a;MasaFramework 基于 .NET 8动态函数&#xff1a;基于JavaScript V8引擎实现向量搜索…

物联网配网工具多元化助力腾飞——智能连接,畅享未来

随着物联网技术的迅猛发展&#xff0c;智能插座、蓝牙网关作为其中常见的智能物联设备&#xff0c;无论是功能还是外观都有很大的改进&#xff0c;在智能化越来越普遍的情况下&#xff0c;它们的应用场景也在不断拓宽。对于智能设备而言&#xff0c;配网方式的选择对于设备的成…

Jenkins CI/CD 持续集成专题一 Jenkins的安装和配置

一 jenkins 官方教程 安装Jenkins 二 安装 2.1 安装方式一 通过安装包的package方式安装 第一步下载链接&#xff1a; Download the latest package 第二步操作方式&#xff1a;打开包并按照说明操作即可安装 2.2 安装方式二 brew安装 第一 安装最新版本jenkins brew in…

【Java框架】SpringMVC(二)——SpringMVC数据交互

目录 前后端数据交互RequestMapping注解基于RequestMapping注解设置接口的请求方式RequestMapping注解的常用属性一个方法配置多个接口method属性params属性headers属性consumes属性produces属性 SpringMVC中的参数传递默认单个简单参数默认多个简单参数默认参数中有基本数据类…

掌控基础设施,加速 DevOps 之旅:IaC 深度解析

在当今的 DevOps 世界中&#xff0c;基础设施即代码&#xff08;IaC&#xff09;是一个非常重要的概念。它在整个行业几乎无处不在&#xff0c;是现代工程角色的绝对关键。 本文将主要包含 IaC 的定义和它的好处&#xff0c;同时将 Walrus 作为最佳实践来进行详细讲解。 什么是…

Verilog 不可综合部分

Verilog中存在部分用于仿真验证的子集&#xff0c;只在仿真时使用&#xff0c;因为没有对应的硬件元件&#xff0c;因此不可综合。 一般综合工具不支持的Verilog HDL结构 initialtable, primitive (UDP)fork...joinforce...releasedeassigndefparameventforever, while, repe…

山与路远程控制 一个基于electron和golang实现的远控软件

山与路远程控制 &#x1f3a5;项目演示地址 还在制作… ♻️项目基本介绍 山与路远程控制是基于electron(vue3)和golang实现的远程控制软件(项目界面主要模仿向日葵远程软件,如有侵权请告知),代码可能有点臃肿毕竟只花了一周左右写的无聊项目,如果对其感兴趣的大佬可以fork自…

【JavaScriptThreejs】判断路径在二维平面上投影的方向顺逆时针

原理分析 可以将路径每个连续的两点向量叉乘相加&#xff0c;根据正负性判断路径顺逆时针性 当我们计算两个向量的叉积时&#xff0c;结果是一个新的向量&#xff0c;其方向垂直于这两个向量所在的平面&#xff0c;并且其大小与这两个向量构成的平行四边形的面积成正比。这个新…

爱普生RX-8130CE内置电池控制 RTC

特点&#xff1a;(1)封装极小&#xff0c;集成度高RX-8130CE是一个带|2C接口的实时时钟模块&#xff0c;内部集成32.768KHz晶体振荡器。实时时钟功能不仅集成了年、月、日、星期、小时、分、秒的日历和时钟计数器&#xff0c;同时也有时间闹钟、间隔定时器、时间更新中断等功能…

算法练习|Leetcode49字母异位词分词 ,Leetcode128最长连续序列,Leetcode3无重复字符的最长子串,sql总结

目录 一、Leetcode49字母异位词分词题目描述解题思路方法:哈希总结 二、Leetcode128最长连续序列题目描述解题思路方法:总结 三、Leetcode3无重复字符的最长子串题目描述解题思路方法:双指针法总结sql总结 一、Leetcode49字母异位词分词 题目描述 给你一个字符串数组&#xf…

flask后端实践03-Flask-Restful处理Controller

Flask-Restful处理Controller flask-restful-quickstart 使用flask-restful主要目的是解决如下问题 注册多个路由 api.add_resource(HelloWorld,/,/hello)从demo示例可以看到&#xff0c; 这里类似go的httpserver的httpHandler的概念&#xff0c;写一个路由处理器&#xff…

编译支持播放H265的cef控件

接着在上次编译的基础上增加h265支持编译支持视频播放的cef控件&#xff08;h264&#xff09; 测试页面&#xff0c;直接使用cef_enhancement,里边带着的那个html即可&#xff0c;h265视频去这个网站下载elecard,我修改的这个版本参考了里边的修改方式&#xff0c;不过我的这个…