剑指offer 链表 持续更新中...

文章目录

  • 1. 实现单链表的插入和删除
  • 2. 从尾到头打印链表
    • 2.1 题目描述
    • 2.2 方法1,直接逆转
    • 2.3 方法2,使用栈
    • 方法3,递归

1. 实现单链表的插入和删除

#include <iostream>struct ListNode
{explicit ListNode(int val_p = 0, ListNode *next_p = nullptr): next(next_p), val(val_p){}ListNode *next;int val;
};// 添加val节点
void push_val(ListNode **phead, int val)
{if (*phead == nullptr) {std::cout << "phead has been set\n";*phead = new ListNode(val);return;}// 找到尾结点ListNode *tail = *phead;while (tail->next != nullptr) {tail = tail->next;}auto newNode = new ListNode(val);tail->next = newNode;
}// 删除第一个匹配val的节点
void erase_val(ListNode **phead, int val)
{if (*phead == nullptr) {std::cout << "phead is empty\n";return;}ListNode *cur = *phead, *prev = nullptr;if (cur->val == val) {std::cout << "head has changed\n";*phead = cur->next;delete cur;return;}while (cur) {if (cur->val == val) {if(!prev)	return;			// 虽然prev不会为空, 这里主要是为了去除编译器的warningprev->next = cur->next;delete cur;return;}prev = cur;cur = cur->next;}std::cout << "has no value equal to val\n";
}void print_list(ListNode *phead)
{if (phead == nullptr) {std::cout << "phead is empty\n";return;}while (phead) {std::cout << phead->val << ' ';phead = phead->next;}std::cout << '\n';
}void delete_list(ListNode **phead)
{ListNode *cur = *phead;if (cur == nullptr) {std::cout << "phead is empty, do nothing\n";return;}while (cur) {ListNode *next = cur->next;std::cout << cur->val << ' ';delete cur;cur = next;}std::cout << '\n';
}int main()
{ListNode *list = nullptr;push_val(&list, 1);push_val(&list, 2);push_val(&list, 3);push_val(&list, 4);erase_val(&list, 4);
//	erase_val(&list, 3);
//	erase_val(&list, 1);
//	erase_val(&list, 2);print_list(list);std::cout << "delete: ";delete_list(&list);return 0;
}

2. 从尾到头打印链表

LCR 123. 图书整理 I - 力扣(LeetCode)

2.1 题目描述

给你一个单链表的头结点,从尾到头打印出链表的每个节点的值。

示例 1:

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

2.2 方法1,直接逆转

class Solution {    vector<int> v;
public:vector<int> reverseBookList(ListNode* head) {if(head == nullptr)    return {};reverseList(head);while(head) {int val = head->val;std::cout << val;v.push_back(val);head = head->next;}return v;}// 链表逆置void reverseList(ListNode* &head){ListNode* prev = nullptr, *cur= head, *next = cur->next;// 只有一个节点, 不需要逆置, 直接返回if(next == nullptr)return;while(next) {auto next_next = next->next;        // 先保存一下next->next = cur;cur->next = prev;prev = cur;cur = next;next = next_next;}head = cur;    // 把head归位}
};

有可能要求不能修改链表的结构,这样就用到了下面两种方法

2.3 方法2,使用栈

class Solution {std::stack<int> s;
public:vector<int> reverseBookList(ListNode* head) {vector<int> v;while(head) {s.push(head->val);head = head->next;}while(!s.empty()) {int val = s.top();v.push_back(val);std::cout << val << ' ';s.pop();}return v;}
};

方法3,递归

class Solution {    vector<int> v;
public:vector<int> reverseBookList(ListNode* head) {dfs(head);return v;}void dfs(ListNode* cur){if(cur == nullptr) {return;}dfs(cur->next);std::cout << cur->val;v.push_back(cur->val);}
};

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

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

相关文章

vim交换文件的作用

1.数据恢复&#xff1a;因为vim异常的退出&#xff0c;使用交换文件可以恢复之前的修改内容。 2.防止多人同时编辑&#xff1a;vim检测到交换文件的存在,会给出提示&#xff0c;以避免一个文件同时被多人编辑。 &#xff08;vim交换文件的工作原理&#xff1a;vim交换文件的工作…

无用知识之:std::initializer_list的秘密

先说结论&#xff0c;用std::initializer_list初始化vector&#xff0c;内部逻辑是先生成了一个临时数组&#xff0c;进行了拷贝构造&#xff0c;然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化&#xff0c;这个动作又触发了拷贝…

CoRAG 来自微软与人大的创新RAG框架技术

微软与人大合作开发的CoRAG(Chain-of-Retrieval Augmented Generation)是一种创新的检索增强生成(RAG)框架,旨在通过模拟人类思考方式来提升大语言模型(LLM)在复杂问题上的推理和回答能力。以下是对CoRAG的深度介绍: 1. CoRAG的核心理念 CoRAG的核心思想是通过动态调…

一文讲解HashMap线程安全相关问题(上)

HashMap不是线程安全的&#xff0c;主要有以下几个问题&#xff1a; ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素&#xff0c;在多线程的环境下&#xff0c;扩容的时候就有可能导致出现环形链表&#xff0c;造成死循环。 JDK 8 时已经修复了这个问…

网络基础知识

1 互联网本质 ​ 互联网&#xff08;英语&#xff1a;Internet&#xff09;是指20世纪末期兴起电脑网络与电脑网络之间所串连成的庞大网络系统。这些网络以一些标准的网络协议相连。它是由从地方到全球范围内几百万个私人、学术界、企业和政府的网络所构成&#xff0c;通過电子…

DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下载 Ollama&#x1f98b; 选择模型&#x1f98b; 运行模型&#x1f98b; 使用 && 测试 二&#xff1a;&#x1f525; Chat…

012-51单片机CLD1602显示万年历+闹钟+农历+整点报时

1. 硬件设计 硬件是我自己设计的一个通用的51单片机开发平台&#xff0c;可以根据需要自行焊接模块&#xff0c;这是用立创EDA画的一个双层PCB板&#xff0c;所以模块都是插针式&#xff0c;不是表贴的。电路原理图在文末的链接里&#xff0c;PCB图暂时不选择开源。 B站上传的…

首发!ZStack 智塔支持 DeepSeek V3/R1/ Janus Pro,多种国产 CPU/GPU 可私有化部署

2025年2月2日&#xff0c;针对日益强劲的AI推理需求和企业级AI应用私有化部署场景&#xff08;Private AI&#xff09;&#xff0c;云轴科技 ZStack 宣布 AI Infra 平台 ZStack 智塔全面支持企业私有化部署 DeepSeek V3/R1/ Janus Pro三种模型&#xff0c;并可基于海光、昇腾、…

谭浩强C语言程序设计(4) 8章(下)

1、输入三个字符串按照字母顺序从小到大输出 #include <cstdio> // 包含cstdio头文件&#xff0c;用于输入输出函数 #include <cstring> // 包含cstring头文件&#xff0c;用于字符串处理函数#define N 20 // 定义字符串的最大长度为20// 函数&#xff1a;…

洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解

一、题目链接 P10289 [GESP样题 八级] 小杨的旅游 - 洛谷 二、题目大意 n个节点之间有n - 1条边&#xff0c;其中k个节点是传送门&#xff0c;任意两个传送门之间可以 以0单位地时间相互到达。问从u到v至少需要多少时间&#xff1f; 三、解题思路 输入不必多讲。 cin >> …

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)

理解Linux系统内进程信号的整个流程可分为&#xff1a; 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生&#xff0c;本文会讲解信号的保存和信号处理相关的概念和操作&#xff1a; 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…

Python 网络爬虫实战:从基础到高级爬取技术

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 网络爬虫&#xff08;Web Scraping&#xff09;是一种自动化技术&#xff0c;利用程序从网页中提取数据&#xff0c;广泛…

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么&#xff1f;二、设置文件指针的位置&#xff1a;随机读写&#xff0c;SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10&#xff1a;文件指针及目录的创建与…

关于安卓greendao打包时报错问题修复

背景 项目在使用greendao的时候&#xff0c;debug安装没有问题&#xff0c;一到打包签名就报了。 环境 win10 jdk17 gradle8 项目依赖情况 博主的greendao是一个独立的module项目&#xff0c;项目目前只适配了java&#xff0c;不支持Kotlin。然后被外部集成。greendao版本…

设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用

文章目录 概述1. 核心思想2. 结构3. 示例代码4. 优点5. 缺点6. 适用场景7. 案例&#xff1a;模板方法模式在数据处理中的应用案例背景UML搭建抽象基类 - 数据处理的 “总指挥”子类定制 - 适配不同供应商供应商 A 的数据处理器供应商 B 的数据处理器 在业务代码中整合运用 8. 总…

FlashAttention v1 论文解读

论文标题&#xff1a;FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 论文地址&#xff1a;https://arxiv.org/pdf/2205.14135 FlashAttention 是一种重新排序注意力计算的算法&#xff0c;它无需任何近似即可加速注意力计算并减少内存占用。…

stm32硬件实现与w25qxx通信

使用的型号为stm32f103c8t6与w25q64。 STM32CubeMX配置与引脚衔接 根据stm32f103c8t6引脚手册&#xff0c;采用B12-B15四个引脚与W25Q64连接&#xff0c;实现SPI通信。 W25Q64SCK&#xff08;CLK&#xff09;PB13MOSI&#xff08;DI&#xff09;PB15MISO(DO)PB14CS&#xff08…

软件工程概论试题五

一、多选 1.好的软件的基本属性包括()。 A. 效率 B. 可依赖性和信息安全性 C. 可维护性 D.可接受性 正答&#xff1a;ABCD 2.软件工程的三要素是什么()? A. 结构化 B. 工具 C.面向对象 D.数据流! E.方法 F.过程 正答&#xff1a;BEF 3.下面中英文术语对照哪些是正确的、且是属…

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后&#xff0c;目录下有三个文件夹&#xff1a; include 头文件lib 编译的二进制库&#xff0c;根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库&#xff0c;需要在配置属性->C/C->预…

知识库管理在提升企业决策效率与知识共享中的应用探讨

内容概要 知识库管理是指企业对内部知识、信息进行系统化整理和管理的过程&#xff0c;其重要性在于为企业决策提供了坚实的数据支持与参考依据。知识库管理不仅能够提高信息的获取速度&#xff0c;还能有效减少重复劳动&#xff0c;提升工作效率。在如今快速变化的商业环境中…