LeetCode——链表

链表

链表类型:单链表(只有next指针)、双链表(pre指针和next指针)、循环链表(尾节点指向头节点)

增、删、改、遍历、翻转、交换

1.设计链表707中等

class LinkedNode {int val;LinkedNode next;public LinkedNode() {}public LinkedNode(int val) {this.val = val;}
}
class MyLinkedList {// 链表的长度private int size;// 链表的虚拟头节点和虚拟尾节点private LinkedNode head;public MyLinkedList() {size = 0;head = new LinkedNode(0);}public int get(int index) {if (index >= size) {return -1;}LinkedNode cur = head.next;for (int i = 0; i < index; i++) {cur = cur.next;}return cur.val;}public void addAtHead(int val) {addAtIndex(0, val);}public void addAtTail(int val) {addAtIndex(size, val);}public void addAtIndex(int index, int val) {// 检查要插入元素索引的范围if (index < 0 || index > size) {return;}size++;LinkedNode cur = head;for (int i = 0; i < index; i++) {cur = cur.next;}LinkedNode newNode = new LinkedNode(val);newNode.next = cur.next;cur.next = newNode;}public void deleteAtIndex(int index) {// 检查要插入元素索引的范围if (index < 0 || index >= size) {return;}size--;LinkedNode cur = head;for (int i = 0; i < index; i++) {cur = cur.next;}cur.next = cur.next.next;}
}

2.移除链表元素

class Solution {public ListNode removeElements(ListNode head, int val) {// 定义虚拟头节点ListNode newhead = new ListNode(0, head);// pre表示前一个元素,为了删除元素后可以把链表串起来ListNode pre = newhead;// 循环链表的节点,判断该节点的值是否与val相等ListNode cur = head;while (cur != null) {if (cur.val == val) {// cur = cur.next;// pre.next = cur;pre.next = cur.next;} else {pre = pre.next;// cur = cur.next;}cur = cur.next;}return newhead.next;}
}

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

//  // 先实现,写两次遍历,第一次记录链表的结点总个数,第二次删除;这里要防止第一次遍历结束后还能找到头
// class Solution {
//     public ListNode removeNthFromEnd(ListNode head, int n) {
//         // 第一次遍历
//         ListNode newhead = new ListNode (-1, head);
//         ListNode cur = head;
//         int count = 0;
//         // 第一次遍历
//         while (cur != null) {
//             count += 1;
//             cur = cur.next;
//         }
//         // 第二次遍历
//         // num记录要从前往后遍历到第几个位置
//         int num = count - n;
//         ListNode now = newhead;
//         while (num > 0) {
//             now = now.next;
//             num -= 1;
//         }
//         now.next = now.next.next;
//         return newhead.next;
//     }
// }// // 双指针,快慢指针,第一个指针先走n步,第二个指针留在初始位置,那么当第一个位置走到链表尾部的时候,第二个指针就处在在删除的节点位置(如果加上虚拟头节点,就是走在了要删除节点的前一个节点上)
// class Solution {
//     public ListNode removeNthFromEnd (ListNode head, int n) {
//         // 定义一个虚拟头节点
//         ListNode newhead = new ListNode(-1, head);
//         // 定义第一个节点
//         ListNode first = head;
//         // 定义第二个节点
//         ListNode second = newhead;
//         int i = 0;
//         while (i < n) {
//             i ++;
//             first = first.next;
//         }
//         while (first != null) {
//             first = first.next;
//             second = second.next;
//         }
//         // 删除节点
//         second.next = second.next.next;
//         return newhead.next;
//     }
// }// 栈
class Solution {public ListNode removeNthFromEnd (ListNode head, int n) {// 定义虚拟头节点ListNode newhead = new ListNode (-1, head);// 定义栈Deque<ListNode> stack = new LinkedList<ListNode>();ListNode cur = newhead;while (cur != null) {stack.push(cur);cur = cur.next;}for (int i = 0; i < n; i ++) {stack.pop();}// stack.peek()检索到栈顶元素并获取到,但是不会被删除ListNode prev = stack.peek();prev.next = prev.next.next;return newhead.next;}
}

4.两两交换链表中的节点24中等

重点是要一直链起来,不要忽略某个步骤断掉链表

class Solution {public ListNode swapPairs(ListNode head) {// 定义一个虚拟头节点ListNode newhead = new ListNode(-1, head);// 一个节点一个节点进行遍历ListNode cur = newhead;while (cur.next != null && cur.next.next != null) {ListNode bef = cur.next;ListNode aft = cur.next.next;// 交换cur.next = aft;  // 链住bef.next = aft.next;  // 交换aft.next = bef;cur = bef;}return newhead.next;}
}

5.相交链表160简单

// class Solution {
// public:
//     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
//         // 使用哈希表存储节点。首先遍历链表A,将A中的节点存入哈希表,遍历链表B,如果B中的节点在哈希表中,之后的所有节点都要在hash表中;如果不在,继续遍历B的下一个节点
//         // 定义以节点为元素的hash表
//         unordered_set<ListNode *> visited;
//         ListNode *temp = headA;
//         while (temp != nullptr) {
//             visited.insert(temp);
//             temp = temp -> next;
//         }
//         temp = headB;
//         while (temp != nullptr) {
//             if (visited.count(temp)) {
//                 return temp;
//             }
//             temp = temp -> next;
//         }
//         return nullptr;
//     }
// };class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 双指针,利用相遇的时候两个指针应该走过一样的步数if (headA == nullptr || headB == nullptr) {return nullptr;}ListNode *pA = headA;ListNode *pB = headB;while (pA != pB) {if (pA == nullptr) {pA = headB;} else {pA = pA->next;}if (pB == nullptr) {pB = headA;} else {pB = pB->next;}}return pB;}
};

【未完待续……】

总结:

如果由遍历且修改的需求,虚拟头接带你好使

链表要链起来始终

找规律,有没有简单实现的方法,例如反转链表,是不是头插法就很合适

思想:双指针!排序的话归并!

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

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

相关文章

基于SpringBoot的精简博客系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的精简博客系统,java项目…

关键字:throw关键字

在 Java 中&#xff0c;throw关键字用于抛出异常。当程序执行过程中发生意外情况&#xff0c;如错误的输入、资源不足、错误的逻辑等&#xff0c;导致程序无法正常执行下去时&#xff0c;可以使用throw关键字抛出异常。 以下是使用throw关键字的一些示例&#xff1a; 抛出异常…

MySQL 四种插入命令及其特点与锁机制

目录 1. INSERT INTO 2. INSERT IGNORE INTO 3. INSERT INTO ... ON DUPLICATE KEY UPDATE 4. REPLACE INTO 总结 MySQL提供了多种数据插入方式&#xff0c;每种方式在处理唯一键冲突时的行为不同&#xff0c;同时也涉及不同的锁机制。 1. INSERT INTO INSERT INTO是标准…

JaveScript 的 newFunction

1、new Function的基础概念 new Function() 是 JavaScript 中的一个构造函数&#xff0c;它可以实例化一个新的函数对象并返回。该函数对象可以使用传递给 new Function() 的字符串参数作为函数体&#xff0c;并使用其他传递给它的参数作为函数参数&#xff0c;从而动态创建一…

42 个通过示例解释所有 JavaScript 数组方法

今天&#xff0c;就让我们一起来看看这 42 个数组方法。 1. at 获取特定索引处的元素。 负索引表示从末尾开始计数&#xff08;例如&#xff1a;-1 是最后一个元素&#xff09;。 const names ["Jhon", "Bob", "Alice", "Joe"]; c…

服装店收银系统不只是收银 还需要线上商城和线上批发

一个综合性的服装店收银系统可以结合线上商城和线上批发功能&#xff0c;提供以下特点和优势&#xff1a; 线上商城&#xff1a;将服装店的商品信息同步到线上商城平台&#xff0c;让顾客可以通过网站或移动应用程序浏览和购买商品。线上商城可以实现在线支付、订单跟踪、售后服…

MySQL数据库索引优化

一、引言 1. 索引的重要性 MySQL数据库索引的重要性主要体现在&#xff0c;一是查询速度优化&#xff0c;索引可以极大地提高查询速度。对于没有索引的表&#xff0c;MySQL必须进行全部扫描来找到所需的行&#xff0c;如果表中数据量很大&#xff0c;那么通常很慢。通过适当的…

大数据规模存储的几个核心问题

文章目录 三个关键问题RAID&#xff08;独立磁盘冗余阵列&#xff09;RAID是如何解决关于存储的三个关键问题&#xff1f;水平伸缩 大规模数据存储都需要解决几个核心问题&#xff0c;这些问题都是什么呢&#xff1f; 三个关键问题 1.数据存储容量的问题 既然大数据要解决的…

图像分割实战-系列教程1:语义分割与实例分割概述

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 下篇内容&#xff1a; Unet系列算法 1、图像分割任务概述 1.1 图像分割 分割任务就是在原始图像…

window的OPen方法,弹窗的特征

文章目录 一、介绍二、弹窗的特征 一、介绍 window.open() 方法是 JavaScript 中的一个内置方法&#xff0c;用于在浏览器中打开一个新的窗口或标签页。 语法&#xff1a; window.open(url, name, features, replace)二、弹窗的特征 open方法参数说明: 参数说明url要载入窗…

【算法】数论---取模运算法则

取模运算&#xff08;余数运算&#xff09;有一些基本的运算法则&#xff1a; (a b) % m (a % m b % m) % m(a - b) % m (a % m - b % m) % m(a * b) % m (a % m * b % m) % ma ^ b % p ((a % p)^b) % p 取模运算&#xff08;余数运算&#xff09;有一些基本的性质&…

2023年12月第4周面试算法题总结

809. 情感丰富的文字——阅读理解题 1、s “abcd”; words [“abc”]; 的情况怎么处理 2、怎么求lens与lenw&#xff1f;&#xff08;连续出现的字符串长度&#xff09; class Solution { public: bool isStretchy(const string& s, const string& word) {int i 0…

基于SpringBoot的医疗挂号管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的医疗挂号管理系统,java…

详述numpy中的np.random各个函数的用法

文章目录 引言np.random.rand()np.random.randn()np.random.randint(low&#xff0c;high&#xff0c;size&#xff0c;dtype)np.random.uniform(low&#xff0c;high&#xff0c;size)参考文献 引言 在机器学习还有深度学习中&#xff0c;经常会用到这几个函数&#xff0c;为…

AKShare学习笔记

AKShare学习笔记 本文内容参考AKShare文档。AKShare开源财经数据接口库采集的数据都来自公开的数据源&#xff0c;数据接口查询出来的数据具有滞后性。接口参考AKShare数据字典。 AKShare环境配置 安装Anaconda&#xff0c;使用Anaconda3-2019.07版本包&#xff0c;配置清华数…

Elasticsearch8集群部署

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 本文记录在3台服务器上离线搭建es8.7.1版本集群。 1. 修改系统配置 1.1 hosts配置 在三台es节点服务器加入hostname解析&…

加法器原理详解

加法器的介绍与原理分析 什么是加法器&#xff1f; 加法器是一种数字电路&#xff0c;用于将两个二进制数相加并输出它们的和。 如何实现加法器 要讨论如何实现加法器就要先从只有一位的数字先进行考虑 一位二进制数相加 不考虑来自低位的进位——半加器 对于一位二进制…

【VTK三维重建-体绘制】第四期 VTK中GPU加速

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 前言 上期内容讲到VTK的体绘制技术vtkGPUVolumeRayCastMapper&#xff0c;本文分享VTK中GPU加速的相关内容&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会…

图像分割实战-系列教程7:unet医学细胞分割实战5(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 unet医学细胞分割实战1 unet医学细胞分割实战2 unet医学细胞分割实战3 unet医学细胞分割实战4 unet…

机器学习的分类与经典算法

机器学习算法按照学习方式分类&#xff0c;可以分为有监督学习&#xff08;Supervised Learning&#xff09;、无监督学习&#xff08;Unsupervised Learning&#xff09;、半监督学习&#xff08;Semi-supervised Learning&#xff09;、强化学习&#xff08;Reinforcement Le…