三、 链表

一、链表的定义

链表是一种动态数据结果,内存分配不是在创建链表时一次性完成的,每添加一个节点,分配一次内存,由于没有闲置的内存,链表的空间效率高于数组

二、定义单向链表

struct ListNode
{int m_nValue;ListNode* m_pNext;
};
void AddToTail(ListNode** pHead, int value)
{ListNode* pNew = new listNode();pNew->m_nValue = value;pNew->m_pNext = nullptr;if (*pHead == nullptr){*pHead = pNew;}else{ListNode* pNode = *pHead;while (*pHead->m_pNext != nullptr)pNode = pNode->m_pNext;pNode->m_pNext = pNew;}
}

3. 删除链表中的一个元素

void RemoveNode(ListNode** pHead, int value)
{if (pHead == nullptr || *pHead == nullptr)//pHead是指向链表头节点的指针,*pHead是链表的头节点return;ListNode* pToBeDeleted = nullptr;//分成两种情况,头节点和其他节点if ((*pHead)->m_nValue == value)//如果头节点是要删除的目标{pToBeDeleted = *pHead;*pHead = (*pHead)->m_pNext;}else{ListNode* pNode = *pHead;while (pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue != value)pNode = pNode->m_pNext;if (pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue == value){pToBeDeleted = pNode->m_pNext;pNode->m_pNext = pNode->m_pNext->m_pNext;}}if (pToBeDeleted != nullptr){delete pToBeDeleted;pToBeDeleted = nullptr;}
}

4 从头到尾打印链表

  1. 上面这段代码中设计到了结构体的知识,结构体以struct为关键字,结构体内部可以有多个变量和函数。结构体的定义结构如下
struct Person
{
int n_year;
string name;
void sayHellow()
{
定义内容;
}
};
  1. ListNode** pHead
    两个**表示的是指向指针的指针

5 相交链表

在这里插入图片描述

5.1方法一

使用哈希表解决

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {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;}
};
5.1.2代码中遇到的问题

1.哈希表的定义

unordered_set 无键值哈希表
unordered_map 有键值哈希表

2.哈希表的一些函数
1.插入元素:

insert(key, value):向std::unordered_map中插入键值对(key, value)。
insert(value):向std::unordered_set中插入元素value。

2.访问元素:

at(key):以给定的key作为参数,在std::unordered_map中查找对应的值,并返回引用。
find(key):在std::unordered_map中查找具有给定key的元素。如果找到,返回指向该元素的
迭代器;否则返回end()迭代器。
count(key):在std::unordered_map中计算具有给定key的元素个数。当存在时,返回1,否则返回0。

3.删除元素:

erase(key):从std::unordered_map中删除具有给定key的键值对。
erase(position):从std::unordered_map或std::unordered_set中删除给定位置(迭代器)上的元素。
clear():从std::unordered_map或std::unordered_set中删除所有元素。

4.迭代遍历:

使用auto关键字和range-based for循环遍历哈希表中的元素。
使用迭代器(如begin()和end())进行循环访问。

5.2方法二

使用双指法,双指针法的时间复杂度为O(n),空间复杂度为O(1)

class Solution{
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB){ListNode *A = headA;ListNode *B = headB;while (A!=nullptr && B!=nullptr){A = A->next;B= B->next;}if (A ==nullptr) A = headB;if (B ==nullptr) B = headA;while (A!=nullptr && B!=nullptr){A = A->next;B= B->next;}if (A ==nullptr) A = headB;if (B ==nullptr) B = headA;while (A!=nullptr && B!=nullptr){if(A == B) return A;A = A->next;B= B->next;}return nullptr;}
};

5.2.1 遇到的问题

nullptr:在C++中,nullptr 是一个特殊的空指针常量,用于表示一个指针不指向任何有效的内存地址。它在C++11标准中引入,旨在取代以前使用的 NULL 或 0 来表示空指针

6.删除链表倒数第n个节点

题目:在这里插入图片描述

6.1 方法一

运行两遍,第一遍读取链表长度,第二遍删除节点

class Solution{
public:ListNode* removeNthFromEnd(ListNode* head, int n){if (head==nullptr||head->next==nullptr) return nullptr;ListNode* A = head;int sum_count=0;while(A!=nullptr){A = A->next;sum_count = sum_count + 1;}int forward_count = sum_count - n;A = head;if(n==1)//删除尾节点{while (sum_count-->2){A = A->next;}ListNode* B = A->next;A->next = nullptr;delete B;}else if(sum_count==n)//删除头节点{ListNode* B = A;head = head->next;delete B;}else//删除中间节点{while (forward_count-->1){A = A->next;}ListNode* B = A->next;A->next = A->next->next;delete B;}return head;}
};

6.2 方法二

使用栈的形式,先入栈,然后弹栈,弹的第N个,即为要删除的节点

 class Solution{//栈的形式找节点public:ListNode* removeNthFromEnd(ListNode* head, int n){stack<ListNode*> stk;ListNode* dummy = new ListNode(0,head);ListNode *A = head;ListNode *B = dummy;while(dummy){  stk.push(dummy);dummy = dummy->next;}while(n-->0){stk.pop();}ListNode *prev = stk.top();A = prev->next;prev->next = prev->next->next;delete A;head = B->next;delete dummy;return head;}};
6.2.1 遇到的问题

栈的定义:
栈的定义使用std模板中的stack,stack中有一些函数

入栈:stk.push(dummy);
出栈:stk.pop();
读取栈顶元素:stk.top();

方法三 6.3

快慢指针

class Solution{//快慢指针
public:ListNode* removeNthFromEnd(ListNode* head, int n){ListNode* dummy = new ListNode(0, head);ListNode* Fast = head;ListNode* Low = dummy;for(int i = 0; i < n; ++i){Fast = Fast->next;}while(Fast){Fast = Fast->next;Low = Low->next;}Low->next = Low->next->next;ListNode* ans = dummy->next;delete dummy;return ans;}
};

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

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

相关文章

DevChat:VSCode中基于大模型的AI智能编程助手

#AI编程助手哪家好&#xff1f;DevChat“真”好用# 文章目录 1. 前言2. 安装2.1 注册新用户2.2 在VSCode中安装DevChat插件2.3 设置Access Key 3. 实战使用4. 总结 1. 前言 DevChat是由Merico公司精心打造的AI智能编程助手。它利用了最先进的大语言模型技术&#xff0c;像人类…

nodejs+vue智慧补助系统的设计与实现-计算机毕业设计

随着网络技术的不断发展&#xff0c;多媒体技术应用渐渐的出现在教育领域中&#xff0c;智慧补助系统已经成为教育发展的一个热门话题。 在众多网络开发技术中&#xff0c;nodejs是当前很热门的一种软件&#xff0c;因为它可以进行数据库操作及方便用户控制管理。 在各学校的教…

QML 创建 Web 混合应用

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 随着互联网的快速发展,Web 应用在各个领域中变得越来越流行。为了满足用户对多样化功能的需求,我们经常需要将 Web 技术和原生应用相结合,来创建混合应用程序。 混合应用程序:是一种应用程序开发方法,它…

k8s、pod

Pod k8s中的port【端口&#xff1a;30000-32767】 port &#xff1a;为Service 在 cluster IP 上暴露的端口 targetPort&#xff1a;对应容器映射在 pod 端口上 nodePort&#xff1a;可以通过k8s 集群外部使用 node IP node port 访问Service containerPort&#xff1a;容…

错误: 找不到或无法加载主类 回归java运行的本质

错误: 找不到或无法加载主类 回归java运行的本质 一&#xff0c;背景 当有了idea这种工具后&#xff0c;java的mian方法执行起来是如此简单&#xff0c;很少有人再手动编辑并通过命令行执行了。 同时&#xff0c;在当今Spring Boot盛行的今天&#xff0c;恐怕很少再有人执行j…

跟着步骤,快速实现图书行业小程序商城

跟着步骤&#xff0c;快速实现图书行业小程序商城 打造独特图书购物体验&#xff0c;小程序商城制作指南 轻松搭建图书馆与书店的线上商城小程序 值得一试的图书教材小程序商城搭建方法 图书商城小程序制作指南&#xff0c;助你成为行业领袖 实战教程&#xff1a;如何制作…

Android开发知识学习——HTTPS

文章目录 定义HTTPS连接HTTPS 连接建立的过程课后题 定义 HTTP Secure / HTTP over SSL / HTTP over TLS SSL&#xff1a;Secure Socket Layer -> TLS Transport Layer Security 定义&#xff1a;在HTTP之下增加的一个安全层&#xff0c;用于保障HTTP的加密传输 本质&…

云计算助力史上首届“云上亚运”圆满成功!

201金&#xff0c;魔幻的BGM&#xff0c;以及崛起的中国科技&#xff0c;让杭州亚运会成功出圈。 很多网友表示太震撼了&#xff01;开幕式很漂亮&#xff0c;杭州为了奥运造新城真豪横&#xff0c;看完一整个文化自信住&#xff01; 赛场内外除了无数个令人感动的瞬间&#…

FPGA时序分析与约束(8)——时序引擎

一、概述 要想进行时序分析和约束&#xff0c;我们需要理解时序引擎究竟是如何进行时序分析的&#xff0c;包括时序引擎如何进行建立分析&#xff08;setup&#xff09;&#xff0c;保持分析(hold)&#xff0c;恢复时间分析(recovery)和移除时间分析(removal)。 二、时序引擎进…

Django添加csrf保护机制

步骤 要在Django中启用CSRF保护&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 在Django的settings.py文件中&#xff0c;确保django.middleware.csrf.CsrfViewMiddleware中间件已添加到MIDDLEWARE设置中。通常&#xff0c;这个中间件默认就会包含在其中。 2. 在HTM…

一文速通 StarRocks 数据库:核心概念、架构与特性

Author: Xinyao Tian 概述 本文档简要梳理了 StarRocks 的基本信息。 简介 Introduction StarRocks 是面向下个时代的&#xff0c;高性能的数据分析仓库。其提供了实时、多维度、高并发的数据分析能力。 StarRocks is a next-gen, high-performance analytical data warehou…

杂牌行车记录仪特殊AVI结构恢复案例

最近遇到一个杂牌的行车记录仪需要恢复数据&#xff0c;其使用AVI格式&#xff0c;但是在扫描恢复的过程中却发现厂家对其AVI结构进行了“魔改”致程序无法正常识别 故障存储:16G SD卡 fat32文件系统 故障现象: 16G的SD卡&#xff0c;在发生事故后客户尝试自行接到手机上读…

在 Visual Studio 中远程调试 C++ 项目

目录 一、说明二、下载远程工具1. 官网下载2. 自己电脑上拷贝 三、 运行远程工具四、本机Visual Studio配置五、自动部署 一、说明 参考官方文档&#xff1a;https://learn.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging-cpp?viewvs-2022 二、下载远程工具 …

解决:http://localhost:8080 不在以下 request 合法域名列表中

在搭建资源服务器时&#xff0c;遇到了微信开发者工具中无法访问本地资源服务器的情况&#xff0c;报错如下&#xff1a; 参考一篇博文的方法&#xff0c;完美解决 【解决】http://localhost:8080 不在以下 request 合法域名列表中_localhost不在以下 request 合法域名列表中-…

Mac 解决 APP 快捷键冲突

打开 Mac 系统设置键盘->键盘快捷键->App快捷键->添加快捷键&#xff08;加号&#xff09;->标题需要和tab名称完全一致&#xff08;包括中英文、标点符号等&#xff0c;如下图&#xff09;设置快捷键即可 Reference&#xff1a; https://www.cnblogs.com/Questio…

Android开发,车载通讯应用——binder通讯原理解析

Binder简单理解 简单来说&#xff0c;Binder 就是用来Client 端和 Server 端通信的。并且 Client 端和 Server 端 可以在一个进程也可以不在同一个进程&#xff0c;Client 可以向 Server 端发起远程调用&#xff0c;也可以向Server传输数据&#xff08;当作函数参数来传&#…

【element-ui】表格

效果展示 组件代码 <el-table class"compTableClass" ref"tableOOOOO":class"(className in tableConfig)?tableConfig.className:":data"tableConfig.data" :height"tableConfig.height" style"width: 100%"…

阿里发布AI编码助手:通义灵码,兼容 VS Code、IDEA等主流编程工具

今天是阿里云栖大会的第一天&#xff0c;相信场外的瓜&#xff0c;大家都吃过了。这里就不说了&#xff0c;有兴趣可以看看这里&#xff1a;云栖大会变成相亲现场&#xff0c;最新招婿鄙视链来了... 。 这里主要说说阿里还发布了一款AI编码助手&#xff0c;对于我们开发者来说…

selenium+python web自动化测试框架项目实战实例教程

自动化测试对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行... 可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。学习自动化测试最终目的是应用到实际项目中&…

通过shiro框架记录用户登录,登出及浏览器关闭日志

背景&#xff1a; 公司项目之前使用websocket记录用户登录登出日志及浏览器关闭记录用户登出日志&#xff0c;测试发现仍然存在问题&#xff0c; 问题一&#xff1a;当浏览器每次刷新时websocket其实是会断开重新连接的&#xff0c;因此刷新一下就触发记录登出的日志&#xff0…