算法学习——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.hqwc.cn/news/456535.html

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

相关文章

【Jenkins】pipeline基本使用

目录 一、pipeline 二、创建pipeline项目 1、安装pipeline插件 2、创建pipeline项目 三、pipeline语法 1、pipeline组成 2、agent&#xff1a;指定流水线的执行位置&#xff0c;流水线中每个阶段都必须在某个地方执行 3、stage&#xff1a;阶段&#xff0c;代表流水线的…

Qt 常见容器类用法(二)

目录 QList类 QLinkedList类 QList类 对于不同的数据类型&#xff0c;QList<T>采取不同的存储策略&#xff0c;存储策略如下&#xff1a; 如果T是一个指针类型或指针大小的基本数据类型(该基本类型占有的字节数和指针类型占有的字节数相同)&#xff0c;QList<T>…

负重20kg复合翼垂直起降无人机应用,复合翼无人机技术分析

主要任务应用 1.管线巡查 挂载可见光/红外二合一光电载荷和小型SAR设备&#xff0c;对既定线路进行昼夜巡视侦察&#xff0c;利用图像实时传回指挥控制中心&#xff0c;可用于石油管路、电力线路、舰艇航线及周围态势感知&#xff0c;利于依据现场实情进行战略决策和指令传达…

如何使用Python + 百度翻译API 自动大批量免费翻译Excel文件中的外语内容

手里有一个Excel文件,包括了大量的亚马逊德语搜索词(关键词),每个单元格1个,需要翻译为中文。但是文件大小超过了10M,不能使用百度或Google免费的文档功能,如果手工一个个的翻译然后粘贴又太麻烦,于是想到用Python加免费翻译API完成。 一、openpyxl库 用Python编辑处…

基于SpringBoot+Vue的外卖点餐管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

【深度学习】Softmax实现手写数字识别

实训1&#xff1a;Softmax实现手写数字识别 相关知识点: numpy科学计算包&#xff0c;如向量化操作&#xff0c;广播机制等 1 任务目标 1.1 简介 本次案例中&#xff0c;你需要用python实现Softmax回归方法&#xff0c;用于MNIST手写数字数据集分类任务。你需要完成前向计算…

Springboot+vue的企业财务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的企业财务管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的企业财务管理系统&#xff0c;采用M&#xff08;model&…

SpringBoot Security安全认证框架初始化流程认证流程之源码分析

SpringBoot Security安全认证框架初始化流程&认证流程之源码分析 以RuoYi-Vue前后端分离版本为例分析SpringBoot Security安全认证框架初始化流程&认证流程的源码分析 目录 SpringBoot Security安全认证框架初始化流程&认证流程之源码分析一、SpringBoot Security安…

国外邮箱是什么?功能、作用和价格

不同于我们熟悉的国内邮箱服务&#xff08;如163、QQ邮箱等&#xff09;&#xff0c;国外邮箱通常指的是海外提供商所提供的电子邮件服务&#xff0c;如谷歌的Gmail、微软的Outlook、雅虎的Yahoo Mail等&#xff0c;当然也有特殊的比如Zoho Mail邮箱&#xff0c;国内外双版本&a…

Spring Data Envers 数据审计实战

随着各行各业信息化发展&#xff0c;决策者们越来越意识到数据版本追踪的重要性&#xff0c;尤其是上市公司&#xff0c;数据对于他们尤为重要。考虑到研发成本&#xff0c;对重要表单数据支持页面级的修改历史查看、对所有业务数据支持DB级的版本查看是一个不错的选择。 对于…

全套电气自动化样例图纸分享,使用SuperWorks自动化版免费设计软件!

今天给大家分享一套完备的电气自动化样例图纸&#xff0c;结构准确、内容清晰&#xff0c;适合初学者入门操作练习。 整套图纸包含图纸目录、原理图、端子列表、连接列表、元件列表、接线图&#xff0c;具有较高的参考价值&#xff0c;请大家点击自行下载文件&#xff01; 1e8…

EasyExcel下载带下拉框和批注模板

EasyExcel下载带下拉框和批注模板 一、 代码实现 controller下载入口 /***下载excel模板* author youlu* date 2023/8/14 17:31* param response* param request* return void*/PostMapping("/downloadTemplate")public void downloadExcel(HttpServletResponse r…