代码随想录笔记--链表篇

目录

1--虚拟头节点的使用

2--设计链表

3--反转链表

4--两两交换链表中的节点

5--快慢指针

5-1--删除链表倒数第N个节点

5-2--环形链表

5-3--环形链表II


1--虚拟头节点的使用

        在链表相关题目中,常新定义一个虚拟头结点 dummynode 来指向原链表的头结点,当需要返回链表时,只需返回 dummynode->next;

#include <iostream>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* dummynode = new ListNode(); // 新建虚拟头结点dummynode->next = head;ListNode* cur = dummynode;while(cur->next != nullptr){if(cur->next->val == val){ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;tmp = nullptr;}else{cur = cur->next;}}return dummynode->next;}
};int main(int arc, char *argv[]){ListNode* Node1 = new ListNode(1);ListNode* Node2 = new ListNode(2);ListNode* Node3 = new ListNode(6);ListNode* Node4 = new ListNode(3);ListNode* Node5 = new ListNode(4);ListNode* Node6 = new ListNode(5);ListNode* Node7 = new ListNode(6);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node5;Node5->next = Node6;Node6->next = Node7;Solution S1;int val = 6;ListNode* res = S1.removeElements(Node1, val);ListNode* cur = res;while(cur != NULL){std::cout << cur->val << " ";cur = cur->next;}return 0;
}

2--设计链表

#include <iostream>class MyLinkedList {
public:// 定义链表节点结构体struct LinkedNode {int val;LinkedNode* next;LinkedNode(int val):val(val), next(nullptr){}};// 初始化链表MyLinkedList() {_dummyHead = new LinkedNode(0); // 虚拟头结点_size = 0;}int get(int index) {if (index > (_size - 1) || index < 0) { // 不合法indexreturn -1;}LinkedNode* cur = _dummyHead->next;while(index--){cur = cur->next;}return cur->val;}void addAtHead(int val) {LinkedNode* newNode = new LinkedNode(val);newNode->next = _dummyHead->next;_dummyHead->next = newNode;_size++;}void addAtTail(int val) {LinkedNode* newNode = new LinkedNode(val);LinkedNode* cur = _dummyHead;while(cur->next != nullptr){cur = cur->next;}cur->next = newNode;_size++;}void addAtIndex(int index, int val) {if(index > _size) return;if(index < 0) index = 0;        LinkedNode* newNode = new LinkedNode(val);LinkedNode* cur = _dummyHead;while(index--) {cur = cur->next;}newNode->next = cur->next;cur->next = newNode;_size++;}void deleteAtIndex(int index) {if (index >= _size || index < 0) {return;}LinkedNode* cur = _dummyHead;while(index--) {cur = cur ->next;}LinkedNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;tmp=nullptr;_size--;}// 打印链表void printLinkedList() {LinkedNode* cur = _dummyHead;while (cur->next != nullptr) {std::cout << cur->next->val << " ";cur = cur->next;}std::cout << std::endl;}
private:int _size;LinkedNode* _dummyHead;};int main(int arc, char *argv[]){MyLinkedList myLinkedList;myLinkedList.addAtHead(1);myLinkedList.addAtTail(3);myLinkedList.addAtIndex(1, 2);    // 链表变为 1->2->3std::cout << myLinkedList.get(1) << std::endl;  // 返回 2myLinkedList.deleteAtIndex(1);    // 现在,链表变为 1->3std::cout << myLinkedList.get(1) << std::endl;  // 返回 3return 0;
}

3--反转链表

双指针解法: 

#include <iostream>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* reverseList(ListNode* head){if(head == nullptr) return head;ListNode *pre = nullptr;ListNode *cur = head;while(cur != NULL){ListNode *tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}return pre;}
};int main(int arc, char *argv[]){ListNode *Node1 = new ListNode(1);ListNode *Node2 = new ListNode(2);ListNode *Node3 = new ListNode(3);ListNode *Node4 = new ListNode(4);ListNode *Node5 = new ListNode(5);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node5;Solution S1;ListNode *res = S1.reverseList(Node1);ListNode *cur = res;while(cur != NULL){std::cout << cur->val << " ";cur = cur->next;}return 0;
}

递归写法:

#include <iostream>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* reverseList(ListNode* head){if(head == nullptr) return head;return reverse(head, nullptr);}ListNode* reverse(ListNode* cur, ListNode* pre){if(cur == nullptr) return pre;ListNode *tmp = cur->next;cur->next = pre;return reverse(tmp, cur);}
};int main(int arc, char *argv[]){ListNode *Node1 = new ListNode(1);ListNode *Node2 = new ListNode(2);ListNode *Node3 = new ListNode(3);ListNode *Node4 = new ListNode(4);ListNode *Node5 = new ListNode(5);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node5;Solution S1;ListNode *res = S1.reverseList(Node1);ListNode *cur = res;while(cur != NULL){std::cout << cur->val << " ";cur = cur->next;}return 0;
}

4--两两交换链表中的节点

#include <iostream>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* swapPairs(ListNode* head) {if(head == nullptr) return head;ListNode *dummyNode = new ListNode();dummyNode->next = head;ListNode *cur = dummyNode;while(cur->next != nullptr && cur->next->next != nullptr){ListNode *tmp1 = cur->next;ListNode *tmp2 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = tmp1;tmp1->next = tmp2;cur = cur->next->next;}return dummyNode->next;}
};int main(int arc, char *argv[]){ListNode *Node1 = new ListNode(1);ListNode *Node2 = new ListNode(2);ListNode *Node3 = new ListNode(3);ListNode *Node4 = new ListNode(4);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Solution S1;ListNode *res = S1.swapPairs(Node1);ListNode *cur = res;while(cur != NULL){std::cout << cur->val << " ";cur = cur->next;}return 0;
}

5--快慢指针

5-1--删除链表倒数第N个节点

快慢指针

#include <iostream>
#include <vector>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* removeNthFromEnd(ListNode* head, int n) {ListNode *dummyNode = new ListNode();dummyNode->next = head;ListNode* slow = dummyNode;ListNode* fast = dummyNode;while(n-- && fast != NULL){fast = fast->next;}while(fast->next != NULL){slow = slow->next;fast = fast->next;}ListNode *target = slow->next;slow->next = target->next;delete target;target = nullptr;return dummyNode->next;}
};int main(int argc, char argv[]){ListNode *Node1 = new ListNode(1);ListNode *Node2 = new ListNode(2);ListNode *Node3 = new ListNode(3);ListNode *Node4 = new ListNode(4);ListNode *Node5 = new ListNode(5);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node5;int n = 2;Solution S1;ListNode *res = S1.removeNthFromEnd(Node1, n);ListNode *cur = res;while(cur != NULL){std::cout << cur->val << " ";cur = cur->next;}return 0;
}

5-2--环形链表

快慢指针,当链表有环时,快慢指针必定相遇;

#include <iostream>
#include <vector>struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};class Solution {
public:bool hasCycle(ListNode *head) {if(head == nullptr) return false;ListNode *slow = head;ListNode *fast = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;if(slow == fast) break;}if(fast == NULL || fast->next == NULL) return false;else return true;}
};int main(int argc, char argv[]){ListNode *Node1 = new ListNode(1);ListNode *Node2 = new ListNode(2);ListNode *Node3 = new ListNode(0);ListNode *Node4 = new ListNode(-4);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node2;Solution S1;bool res = S1.hasCycle(Node1);if(res) std::cout << "true" << std::endl;else std::cout << "false" << std::endl;return 0;
}

5-3--环形链表II

        快慢指针,快指针每次走两步,慢指针每次走一步,根据快慢指针是否相遇判断是否有环;

        当快慢指针第一次相遇后,慢指针从头出发,快指针从第一次相遇的节点出发,快慢指针均每次走一步,当下一次相遇时就处于环的入口节点,返回即可;

#include <iostream>
#include <vector>struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};class Solution {
public:ListNode *detectCycle(ListNode *head) {if(head == nullptr) return head;ListNode *slow = head;ListNode *fast = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;if(fast == slow) break; // 第一次相遇}if(fast == NULL || fast->next == NULL) return NULL; // 没有环// 从头开始走slow = head;while(slow != fast){slow = slow->next;fast = fast->next;}// 第二次相遇就是环的入口return slow;}
};int main(int argc, char argv[]){ListNode *Node1 = new ListNode(1);ListNode *Node2 = new ListNode(2);ListNode *Node3 = new ListNode(0);ListNode *Node4 = new ListNode(-4);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node2;Solution S1;ListNode * res = S1.detectCycle(Node1);std::cout << res->val << std::endl;return 0;
}

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

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

相关文章

为何反射探针关闭Mipmap后变成了白图

1&#xff09;为何反射探针关闭Mipmap后变成了白图 2&#xff09;2021.3 Android从AssetBundle中加载视频播放失败问题 3&#xff09;SBP是否可以解决打包时FBX等模型文件中额外的GameObject 4&#xff09;Addressables加载已打包过的Prefab后Mono脚本丢失 这是第349篇UWA技术知…

暑期实习总结(焊点数据管理软件开发):Python操作MySQL数据库、Django搭建前端网页、以及Excel中数据与MySQL数据库的互转

暑期实习总结&#xff08;焊点数据管理软件开发&#xff09;:Python操作MySQL数据库、Django搭建前端网页、以及Excel中数据与MySQL数据库的互转 ​ 这一周是我在企业实习的最后一周&#xff0c;在企业做的项目已基本完成。这篇博客的目的也是总结一些项目中的一些小问题&…

java八股文面试[多线程]——synchronized 和lock的区别

其他差别&#xff1a; synchronized是隐式的加锁,lock是显式的加锁; synchronized底层采用的是objectMonitor,lock采用的AQS; synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列, lock有一个同步队列,可以有多个等待队列; synchronized使用了object类的wait和noti…

博流RISC-V芯片BL616开发环境搭建

文章目录 1、工具安装2、代码下载3、环境变量配置4、下载交叉编译器5、编译与下载运行6、使用ninja编译 本文分别介绍博流RISC-V芯片 BL616 在 Windows和Linux 下开发环境搭建&#xff0c;本文同时适用BL618&#xff0c;BL602&#xff0c;BL702&#xff0c;BL808系列芯片。 1、…

迁移学习:实现快速训练和泛化的新方法

文章目录 迁移学习的原理迁移学习的应用快速训练泛化能力提升 迁移学习的代码示例拓展应用与挑战结论 &#x1f389;欢迎来到AIGC人工智能专栏~迁移学习&#xff1a;实现快速训练和泛化的新方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博…

【Java从0到1学习】13 Java IO流

1. 流 1.1 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中&#xff0c;管道是一条不间断的字节流&#xff0c;用来实现程序或进程间的通信&#xff0c;或读写外围设备、外部文件等。 一个流&#xff0c;必有源端和目的端&#xff0c;它们可以是计算机内存的…

怎么初始化磁盘?这个方法你绝对不知道

在计算机的日常使用中&#xff0c;硬盘扮演着重要的角色&#xff0c;储存着操作系统、文件、程序等重要数据。然而&#xff0c;当我们获得一个新的硬盘或者需要对现有硬盘进行重新配置时&#xff0c;初始化磁盘成为了一个关键步骤。本文将介绍两种常用的初始化磁盘方法&#xf…

STM32F4X 窗口看门狗 WWDG

STM32F4X 窗口看门狗 WWDG STM32F4X窗口看门狗使用独立看门狗与窗口看门狗区别窗口看门狗复位条件窗口看门狗时钟窗口看门狗时钟计数频率窗口看门狗的窗口值窗口看门狗喂狗操作窗口看门狗例程 上一节简单讲了STM32F4X中的独立看门狗的使用&#xff0c;除了独立看门狗之外&#…

Java 中数据结构HashMap的用法

Java HashMap HashMap 是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口&#xff0c;根据键的 HashCode 值存储数据&#xff0c;具有很快的访问速度&#xff0c;最多允许一条记录的键为 null&#xff0c;不支持线程同步。 HashMap 是…

我与GPT的一次关于Orb-SLAM3源码(包括2)的深入对话

目录 一、前言二、关于Orb-SLAM3的代码结构三、关于system3.1 关于摄像头初始化3.2 关于摄像头模型化3.2关于初始化 四、关于ORBVocabulary五、关于优化六、小结 一、前言 Orb-SLAM2或者3是一个开源的视觉SLAM框架&#xff0c;里面的一些思想&#xff0c;一些软件工程的设计理…

ssm会议管理系统源码和论文

ssm会议管理系统源码和论文087 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&…

[C/C++]天天酷跑游戏超详细教程-上篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

Stable Diffusion Web UI的原理与使用

Stable Diffusion是一套基于Diffusion扩散模型生成技术的图片生成方案&#xff0c;随着技术的不断发展以及工业界对这套工程细节的不断优化&#xff0c;使其终于能在个人电脑上运行&#xff0c;本文将从github下载开始讲一讲如何使用Stable Diffusion Web UI进行AI图像的生成。…

摄像头的调用和视频识别

CV_tutorial3 摄像头调用实时播放保存视频 运动目标识别帧差法背景减除法 摄像头调用 创建视频捕捉对象&#xff1a;cv2.VideoCapture() 参数为视频设备的索引号&#xff0c;就一个摄像投的话写0默认&#xff1b; 或者是指定要读取视频的路径。 实时播放 import cv2 import …

华硕笔记本摄像头倒置怎么办?华硕笔记本摄像头上下颠倒怎么调整

笔记本电脑相较于台式电脑&#xff0c;更易携带&#xff0c;解决了很大一部分人的使用需求。但是笔记本电脑也存在很多不足&#xff0c;比如华硕笔记本电脑就经常会出现摄像头倒置的错误&#xff0c;出现这种问题要如何修复呢&#xff1f;下面就来看看详细的调整方法。 华硕笔记…

十二、集合(2)

本章概要 添加元素组集合的打印列表 List 添加元素组 在 java.util 包中的 Arrays 和 Collections 类中都有很多实用的方法&#xff0c;可以在一个 Collection 中添加一组元素。 Arrays.asList() 方法接受一个数组或是逗号分隔的元素列表&#xff08;使用可变参数&#xff…

【STM32】学习笔记-江科大

【STM32】学习笔记-江科大 1、STM32F103C8T6的GPIO口输出 2、GPIO口输出 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口可配置为8种输入输出模式引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V输出模式下可控制端口输出高低电平&#…

【GPT,Flask】用Python Flask结合OpenAI的GPT API构建一个可自主搭建的内容生成应用网站

【背景】 自己构建模型并进行训练需要很高的知识,技能和资源门槛。如今,通过OpenAI提供的API,则可以快速通过GPT能力构建可以提供内容生成服务的在线网站。这套框架可以提供给用户,用户可以利用该框架在自己的环境(比如自己的公司内)构建内容生成服务。你也可以自己上线…

以“迅”防“汛”!5G视频快线筑牢防汛“安全堤”

近期&#xff0c;西安多地突发山洪泥石流灾害。防洪救灾刻不容缓&#xff0c;为进一步做好防汛工作&#xff0c;加强防洪调度监管&#xff0c;切实保障群众的生命财产安全&#xff0c;当地政府管理部门亟需拓展智能化技术&#xff0c;通过人防技防双保障提升防灾救灾应急处置能…

Python基础小讲堂之条件分支与循环

万丈高楼平地起&#xff0c;今天给大家讲讲python中的&#xff1a;条件分支与循环。在学条件分支与循环之前&#xff0c;先掌握一下python的基本操作符。算术操作符&#xff1a; - * / % ** //对于算数操作符的前四个加减乘除&#xff0c;大家都懂&#xff0c;在py…