当前位置: 首页 > news >正文

算法学习——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);}
};

相关文章:

  • 第八届:世界3D渲染挑战赛《无尽阶梯》正式开启
  • 2024.02.05
  • 亚马逊新店铺视频怎么上传?视频验证失败怎么办?——站斧浏览器
  • EasyX图形库学习(三、用easyX控制图形界面中的小球、图片-加载、输出)
  • XGB-3: 模型IO
  • 2024/2/5总结
  • 《深入浅出Go语言》大纲
  • AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺
  • PHP客服系统-vue客服聊天系统
  • 02.05
  • 在线JSON转SQL工具
  • Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用
  • LeetCode、198. 打家劫舍【中等,一维线性DP】
  • app逆向-frida-rpc详解
  • c#string方法对比
  • 【Linux系统编程】快速查找errno错误码信息
  • 10个确保微服务与容器安全的最佳实践
  • Android优雅地处理按钮重复点击
  • co.js - 让异步代码同步化
  • javascript 哈希表
  • Java方法详解
  • Python语法速览与机器学习开发环境搭建
  • React系列之 Redux 架构模式
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 关于使用markdown的方法(引自CSDN教程)
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 马上搞懂 GeoJSON
  • 前端面试之CSS3新特性
  • 通过几道题目学习二叉搜索树
  • MyCAT水平分库
  • 带你开发类似Pokemon Go的AR游戏
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 函数计算新功能-----支持C#函数
  • 进程与线程(三)——进程/线程间通信
  • #1014 : Trie树
  • #QT(TCP网络编程-服务端)
  • #WEB前端(HTML属性)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (5)STL算法之复制
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (分类)KNN算法- 参数调优
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET基础篇——反射的奥妙
  • .NET开发者必备的11款免费工具
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @GlobalLock注解作用与原理解析
  • @hook扩展分析