算法学习——LeetCode力扣链表篇1

算法学习——LeetCode力扣链表篇1

在这里插入图片描述

203. 移除链表元素

203. 移除链表元素 - 力扣(LeetCode)

描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例

示例 1:
在这里插入图片描述

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

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

提示

  1. 列表中的节点数目在范围 [0, 104] 内
  2. 1 <= Node.val <= 50
  3. 0 <= val <= 50

代码解析

自己写版本

容易出现操作空指针,要为对应的特殊情况做处理
直接在原本的链表上做处理。
分为两种情况

  • 删除链表头
  • 删除非表头
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {if (head == NULL)return NULL;ListNode* temp, * tempnext, * Head = head, * dele_val;while (Head->val == val){dele_val = Head;if (Head->next != nullptr)Head = Head->next;else return NULL;delete dele_val;}temp = Head;tempnext = temp->next;if (tempnext == nullptr)return Head;while (tempnext->next != nullptr){if (tempnext->val == val){temp->next = tempnext->next;dele_val = tempnext;delete dele_val;tempnext = temp->next;}else{temp = temp->next;tempnext = temp->next;}}if (tempnext->val == val){temp->next = nullptr;delete tempnext;}return Head;}
};
虚拟头节点

主动在链表之前加一个虚拟头,这样将删除头节点和删除其他节点合并成一种类型

/*** 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) {ListNode *duny_head = new ListNode(0,head);ListNode *cur = duny_head;while(cur->next != nullptr){if(cur->next->val == val) {ListNode *tmp = cur->next;cur->next = cur->next->next;delete tmp;}elsecur = cur->next;}ListNode *result = duny_head->next;delete duny_head;return result;}
};

707. 设计链表

707. 设计链表 - 力扣(LeetCode)

描述

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

  1. MyLinkedList() 初始化 MyLinkedList 对象。
  2. int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
  3. void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
  4. void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
  5. void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
  6. void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

示例

输入
[“MyLinkedList”, “addAtHead”, “addAtTail”, “addAtIndex”, “get”, “deleteAtIndex”, “get”]
[[], [1], [3], [1, 2], [1], [1], [1]]
输出
[null, null, null, null, 2, null, 3]

解释
MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.addAtHead(1);
myLinkedList.addAtTail(3);
myLinkedList.addAtIndex(1, 2); // 链表变为 1->2->3
myLinkedList.get(1); // 返回 2
myLinkedList.deleteAtIndex(1); // 现在,链表变为 1->3
myLinkedList.get(1); // 返回 3

提示

  1. 0 <= index, val <= 1000
  2. 请不要使用内置的 LinkedList 库。
  3. 调用 get、addAtHead、addAtTail、addAtIndex 和 deleteAtIndex 的次数不超过 2000 。

代码解析

class MyLinkedList {
public:struct Linknode{int val;Linknode *next;Linknode():val(0),next(nullptr){}Linknode(int x):val(x),next(nullptr){}Linknode(int x , Linknode* ptr):val(0),next(ptr){}};MyLinkedList() {_dummy_head = new Linknode(0);_size = 0;}int get(int index) {if(index > _size-1 || index < 0) return -1;Linknode *cur = _dummy_head->next;while(index){cur = cur->next;index--;}return cur->val;}void addAtHead(int val) {Linknode *tmp = new Linknode(val);tmp->next = _dummy_head->next;_dummy_head->next = tmp;_size++;}void addAtTail(int val) {Linknode *tmp = new Linknode(val);Linknode *cur = _dummy_head;while(cur->next != nullptr)cur = cur->next;cur->next = tmp;_size++;}void addAtIndex(int index, int val) {if(index > _size) return;else if(index <= 0) addAtHead(val);else if(index == _size) addAtTail(val);else{Linknode *tmp = new Linknode(val);Linknode *cur = _dummy_head;while(index){cur = cur->next;index--;}tmp->next = cur->next;cur->next = tmp;_size++;}}void deleteAtIndex(int index) {if(index > _size-1 || index<0 ) return;Linknode *cur = _dummy_head;while(index){cur = cur->next;index--;}Linknode *tmp = cur->next;cur->next = cur->next->next;delete tmp;_size--;}
private:Linknode *_dummy_head;int _size;
};/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList* obj = new MyLinkedList();* int param_1 = obj->get(index);* obj->addAtHead(val);* obj->addAtTail(val);* obj->addAtIndex(index,val);* obj->deleteAtIndex(index);*/

206. 反转链表

206. 反转链表 - 力扣(LeetCode)

描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

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

示例 3:

输入:head = []
输出:[]

提示

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

进阶

链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

代码解析

自己写版本

处理分四种类型

  1. 链表为空
  2. 链表长度为1
  3. 链表长度为2
  4. 链表大于等于三
#include <iostream>
#include <vector>
#include<algorithm> using namespace std;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) {ListNode *cur ;ListNode* temp1, * temp2 ;if(head == nullptr || head->next == nullptr) return head;//处理链表为空或者长度为1if(head->next->next == nullptr)//处理链表长度为2{temp1 = head;temp2 = head->next;temp2->next = temp1;temp1->next = nullptr;return temp2;}//处理链表长度为3及其以上temp1 = head;cur = temp1->next;temp2 = cur->next;while (temp2 != nullptr){cur->next = temp1;if (temp1 == head){temp1->next = nullptr;temp1 = cur;}     else temp1 = cur;cur = temp2;if(cur->next != nullptr) temp2 = cur->next;//检查链表是否到底else{cur->next = temp1;break;}}return cur;}
};int main()
{vector<int> head = { 1,2,3,4,5,6 };ListNode* head_test = new ListNode(0);ListNode* test  , *cur = head_test;Solution  a;for (int i = 0; i < head.size(); i++){ListNode* temp = new ListNode(head[i]);cur->next = temp;cur = cur->next;}cur->next = nullptr;cur = head_test;cout << "cur list" << endl;while (cur->next != nullptr){cout << cur->val << ' ';cur = cur->next;}cout << cur->val << endl;test = a.reverseList(head_test->next);while (test->next != nullptr){cout << test->val << ' ';test = test->next;}cout << test->val << ' ';return 0;}
双指针法
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode *cur ;ListNode* temp1, * temp2 ;cur = head;temp1 = nullptr;while (cur){temp2 = cur->next;cur->next = temp1;temp1 = cur;cur = temp2;}return temp1;}
};
递归法
class Solution {
public:ListNode* reverse(ListNode *pre , ListNode * cur) {if (cur == nullptr)return pre;ListNode* temp = cur->next;cur->next = pre;return reverse(cur , temp);}ListNode* reverseList(ListNode* head) {return reverse(nullptr , head);}
};

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

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

相关文章

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

进程和线程的区别详解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 进程 进程在系统中是如何管理的 进一步认识PCB 线程 能否一直增加线程数目来提高效率 进程和线程…

SpringMVC精简知识点

SpringMVC 数据格式化基本数据类型和字符串自动转换特殊数据类型和字符串自动转换 验证及国际化应用实例注意事项和使用细节注解的结合使用数据类型转换校验核心类-DatBinder取消某个属性的绑定中文乱码解决处理json和HttpMessageConverter<T>作业布置SpringMVC文件上传自…

HashCat 恢复Excel、Word、PPT密码保姆教程

HashCat 恢复Excel、Word、PPT密码 一、流程 整体需要两个步骤 先用office2john.py获取下文件的hash值 python office2john.py 1.xlsx > hash这个命令需要你电脑有python环境&#xff0c;然后在cmd命令窗口中执行此命令就行 文件链接&#xff1a;https://github.com/magnu…

CSS的Day05(浮动+flex布局)

跟着黑马程序员的课&#xff0c;稍稍对CSS的了解 常见的显示模式&#xff1a;行内、块级、行内块 在HTML中&#xff0c;标准流也称为文档流或普通流&#xff0c;是指元素按照其在HTML文档中的出现顺序依次排列的方式。在标准流中&#xff0c;元素会自动占据父容器的空间&#…

《云原生安全攻防》-- 云原生安全概述

从本节课程开始&#xff0c;我们将正式踏上云原生安全的学习之旅。在深入探讨云原生安全的相关概念之前&#xff0c;让我们先对云原生有一个全面的认识。 什么是云原生呢? 云原生&#xff08;Cloud Native&#xff09;是一个组合词&#xff0c;我们把它拆分为云和原生两个词来…

bitcoin core 请求拒绝响应【或者】卡死

日志 经过排查节点日志&#xff0c;发现抛出异常。 tail -f debug.log日志&#xff1a; 2024-02-05T05:56:26Z BlockUntilSyncedToCurrentChain: txindex is catching up on block notifications 2024-02-05T05:56:26Z BlockUntilSyncedToCurrentChain: txindex is catching…

如何以管理员身份删除node_modules文件

今天拉项目&#xff0c;然后需要安装依赖&#xff0c;但是一直报错&#xff0c;如下&#xff1a; 去搜这个问题会让把node_modules文件先删掉 再去安装依赖。我在删除的过程中会说请以管理员身份来删除。 那么windows如何以管理员身份删除node_modules文件呢&#xff1f; wi…

爬虫实战--爬取简单文字图片并保存到mongodb数据库

文章目录 前言发现宝藏 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚&#xff0c;文章中如果有记录错误&#xff0c;欢迎读者朋友们…

ios搭建OpenGL环境

前言 本篇文章介绍在ios搭建OpenGL开发环境 在app的启动文章中&#xff0c;讲述了一个ios应用是如何启动的以及在IOS 13之后苹果公司推出的多窗口功能&#xff0c;通过app的启动这篇文章&#xff0c;我们基本能随心所欲的搭建一个app应用环境&#xff0c;搭建完成后的基本文件…

idea 快捷键ctrl+shift+f失效的解决方案

文章目录 搜狗输入法快捷键冲突微软输入法快捷键冲突 idea的快捷键ctrlshiftf按了没反应&#xff0c;理论上是快捷键冲突了&#xff0c;检查搜狗输入法和微软输入法快捷键。 搜狗输入法快捷键冲突 不需要简繁切换的快捷键&#xff0c;可以关闭它&#xff0c;或修改快捷键。 微…

海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播

Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制&#xff0c;资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播&#xff0c;资源下…

图解支付-金融级密钥管理系统:构建支付系统的安全基石

经常在网上看到某某公司几千万的个人敏感信息被泄露&#xff0c;这要是放在持牌的支付公司&#xff0c;可能就是一个非常大的麻烦&#xff0c;不但会失去用户的信任&#xff0c;而且可能会被吊销牌照。而现实情况是很多公司的技术研发人员并没有足够深的安全架构经验来设计一套…

简单的JavaScript去下载转换为Base64的PDF文件

新建一个文件&#xff0c;内容填写如下&#xff0c;然后保存为 .html 类型的文件 再用浏览器打开&#xff0c;就会是下面这样子&#xff1a; 图一红色textarea里面&#xff0c;可以将PDF文件转换成BASE64位后的内容贴进去&#xff0c;点击下载时&#xff0c;就可以直接下载成PD…

windows 谷歌浏览器Chrome 怎么禁止更新

1.首先把任务管理器里的谷歌浏览器程序结束&#xff1a; &#xff08;鼠标在任务栏右击&#xff0c;出现任务管理器&#xff09; 2.windowr&#xff0c;输入services.msc 带有Google Update的服务&#xff0c;选择禁用。 3.windowr&#xff0c;输入taskschd.msc 任务计划程序…

MTK8365安卓核心板_联发科MT8365(Genio 350)核心板规格参数

MTK8365安卓核心板是一款高性能的嵌入式处理器产品&#xff0c;基于联发科领先的SoC架构和先进的12纳米工艺。它集成了四核ARM Cortex-A53处理器&#xff0c;每个核心频率高达2.0 GHz&#xff0c;搭载强大的多标准视频加速器&#xff0c;支持高达1080p 60fps的视频解码。此外&a…

C++_多态

目录 1、什么是虚函数 1.1 什么是虚函数重写 1.2 虚函数的继承 1.3 协变 1.4 析构函数的重写 2、override和final 2.1 final 2.2 override 3、纯虚函数/抽象类 3.1 接口继承和实现继承 4、多态的原理 前言&#xff1a; 在C中&#xff0c;多态指的是调用同一个类的…

Python算法题集_环形链表

Python算法题集_环形链表 题234&#xff1a;环形链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【集合检索】2) 改进版一【字典检测】3) 改进版二【双指针】 4. 最优算法 本文为Python算法题集之一的代码示例 题234&#xff1a;环形链表 …

【Elasticsearch】从入门到精通

目前java常见的针对大数据存储的方案并不多&#xff0c;常见的就是mysql的分库分表、es存储 这里偏向es存储方案&#xff0c;es不同的版本之间其实差异还挺大的&#xff0c;本篇博文版本Elasticsearch 7.14.0 Springboot整合Easy-Es Easy-Es官方文档 Elasticsearch的初步认识 …

自学Java的第十九天

一&#xff0c;每日收获 1.排序 2.冒泡排序法 3.查找 4.多维数组-二维数组 二&#xff0c;新名词与小技巧 三&#xff0c;今天学习中所遇到的困难 一&#xff0c;每日收获 1.排序 ① 排序的介绍 排序是将多个数据&#xff0c;依指定的顺序进行排列的过程。 ② 排序的…