三、 链表

news2024/12/24 2:32:26

一、链表的定义

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

二、定义单向链表

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.coloradmin.cn/o/1156272.html

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

相关文章

UG NX机械设计软件常见安装问题

UG软件版本这里咱们就不提了&#xff0c;大部分伙伴应该都是钩子激活软件&#xff0c;肯定会遇到或多或少的安装问题&#xff0c;今天这里给大家总结了下&#xff0c;需要的小伙伴自取。 有其他问题可以一起讨论&#xff0c;也希望看到的小伙伴多关注支持哦。 安装UGNX的必要…

第二个GDAL程序

之前看过一个GDAL入门程序&#xff0c;下面再看一个&#xff0c;熟悉一下GDAL&#xff1b; #include "stdafx.h" #include <gdal_priv.h>int main() {//注册文件格式GDALAllRegister();const char* pszFile "D:\\3dtile\\GDALtestdata\\7-Data\\calss.t…

IDEA使用-通过Database面板访问数据库

文章目录 前言操作过程注意事项1.无法下载驱动2.“Database”面板不显示数据库表总结前言 作为一款强大IDE工具,IDEA具有很多功能,本文将以MariaDB数据库访问为例,详细介绍如何通过IDE工具的Database面板来访问数据库。 操作过程 不同的版本操作会略有差异,这里我们用于演…

【Java笔试强训】Day8(WY20 两种排序方法、HJ108 求最小公倍数)

WY20 两种排序方法 链接&#xff1a;两种排序方法 题目&#xff1a; 考拉有n个字符串字符串&#xff0c;任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法&#xff1a; 1.根据字符串的字典序排序。例如&#xff1a; “car” < “carriage” < “c…

Kubernetes 二进制部署

目录 服务器配置 部署 etcd 集群 准备签发证书环境 部署 docker引擎 flannel网络配置 K8S中Pod网络通信 Overlay Network VXLAN Flannel简介 Flannel工作原理 ETCD之Flannel提供说明 Flannel部署 在master01节点上操作 在所有node节点上操作(以node01为例) 修改d…

【Nginx37】Nginx学习:SSL模块(一)简单配置与指令介绍

Nginx学习&#xff1a;SSL模块&#xff08;一&#xff09;简单配置与指令介绍 又是一个重点模块&#xff0c;SSL 模块&#xff0c;其实就是我们常见的 HTTPS 所需要的配置模块。HTTPS 的重要性不用多说了吧&#xff0c;现在所有的 App、小程序 都强制要求是 HTTPS 的&#xff0…

【数据结构初阶】之单链表

【数据结构初阶】之链表 1. 链表是什么2. 单链表的逻辑结构和物理结构 3.如何创建一个单链表的自定义类型4.单链表的增删查改及各种功能的实现4.1 单链表创建一个节点4.2 单链表的头插4.2.1 头插的函数设计&#xff08;参数类型及其返回值&#xff09;4.2.1 头插的函数实现 4.3…

【SOC基础】单片机学习案例汇总 Part1:电机驱动、点亮LED

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

mybatisplus 增删改查

文章目录 1.BaseMapperBaseMapper中提供的CRUD方法&#xff1a; CURD实例通用ServiceIService中的CRUD方法 Service层操作数据实例 1.BaseMapper 说明: 通用 CRUD 封装BaseMapper 接口&#xff0c;为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器…

集成测试、单元测试、系统测试之间的关系和区别

前言 为了使软件正常工作&#xff0c;所有单元都应集成在一起并正常运行。集成测试就像是要求不同工种的工人修建一个房子&#xff0c;希望他们都团结协作。如何判断他们在一起是否可以按照计划完成建设呢&#xff1f;唯一了解的方法是通过将它们全部拉在一起并测试它们如何相互…

写时拷贝+进程终止

目录 一、写时拷贝 二、创建多进程 三、进程终止 &#xff08;一&#xff09;main函数的返回值 1. main函数的返回值 2. 退出码 3. 查看进程的退出码 &#xff08;二&#xff09;错误码VS退出码 &#xff08;三&#xff09;代码异常终止 1. 基本概念 2. 信号 &…

Visual Studio 2022打不开net4.5项目的解决方案

1 问题 是因为你本机没有装相关的netframework的包&#xff0c;具体文件夹的路径在&#xff1a; C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 如下图&#xff1a; 进入目录看&#xff0c;我的net4.5.2是空的&#xff0c;如下图&#xf…

jsp 网上订餐Myeclipse开发mysql数据库web结构java编程计算机网页项目

选题目的 本设计课题为网上订餐系统设计与实现&#xff0c;提供无纸化点餐、支付&#xff0c;实现点餐快捷&#xff0c;方便管理。餐厅电子化是目前的潮流和趋势&#xff0c;大多数企业都将公司内部运营流程电子化。网上订餐管理系统应运而生&#xff0c;能够有效提高公司的管…

【干货】<img/>加载成功||失败

功能描述 img标签绑定URL时&#xff0c;图片加载会出现如下情况&#xff1a; 加载成功展示url加载失败显示默认图片&#xff08;require(/assets/images/imgError.png)&#xff09; dom代码 <img :src"url" alt"" error"errorImageShow($even…

第57篇-某钩招聘网站加密参数分析【2023-10-31】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…

优化 FPGA HLS 设计

优化 FPGA HLS 设计 用工具用 C 生成 RTL 的代码基本不可读。以下是如何在不更改任何 RTL 的情况下提高设计性能。 介绍 高级设计能够以简洁的方式捕获设计&#xff0c;从而减少错误并更容易调试。然而&#xff0c;经常出现的问题是性能权衡。在高度复杂的 FPGA 设计中实现高性…

【element-ui】表格

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

【ES专题】ElasticSearch 高级查询语法Query DSL实战

目录 前言阅读对象阅读导航前置知识数据准备笔记正文一、ES高级查询Query DSL1.1 基本介绍1.2 简单查询之——match-all&#xff08;匹配所有&#xff09;1.2.1 返回源数据_source1.2.2 返回指定条数size1.2.3 分页查询from&size1.2.4 指定字段排序sort 1.3 简单查询之——…

CUMT-----Java课后第三章编程作业

文章目录 一、题11.1 题目描述1.2 代码块1.3 运行截图 二、题22.1 题目描述2.2 代码块2.3 运行截图 一、题1 1.1 题目描述 1.2 代码块 public class Book {private String name;private int pages;public String getname(){return name;}public void setname(String name){th…

HarmonyOS(二)—— 初识ArkTS开发语言(上)之TypeScript入门

前言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;而Huawei进一步推出了ArkTS。因此在学习使用ArkTS前&#xff0c;需要掌握基本的TS开发技能。 ArkTS介绍 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&am…