【C++算法】链表

news2024/9/24 22:07:42

知识总结

  • 常用技术:

1.画图!!——>直观+形象+便于理解

2.引入虚拟”头结点“

  1. 便于处理边界情况
  2. 方便对链表操作

3.不要吝啬空间,大胆定义变量

4.快慢双指针——判环、找链表中环的入口、找链表中倒数第n个节点

  • 链表中的常用操作

1.创建一个新节点

2.尾插

3.头插

俩数相加

  • 题目链接

俩数相加icon-default.png?t=O83Ahttps://leetcode.cn/problems/add-two-numbers/

  • 算法原理

  • 代码步骤
/**
 * 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* addTwoNumbers(ListNode* l1, ListNode* l2) 
    {
        ListNode* cur1 = l1, *cur2 = l2;
        ListNode* newHead = new ListNode(0);
        int t = 0;
        ListNode* tail = newHead;
        while(cur1 || cur2 || t)
        {
            if(cur1) 
            {
                t += cur1->val;
                cur1 = cur1->next;
            }
            if(cur2)
            {
                t += cur2->val;
                cur2 = cur2->next;
            } 
            tail->next = new ListNode(t % 10);
            t /= 10;
            tail = tail->next;
        }
        tail = newHead->next;
        delete newHead;
        return tail;
    }
};

俩俩交换链表中的节点

  • 题目链接

俩俩交换链表中的节点icon-default.png?t=O83Ahttps://leetcode.cn/problems/swap-nodes-in-pairs/description/

  • 算法原理

  • 代码步骤
/**
 * 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* swapPairs(ListNode* head) 
    {
        if(head == nullptr || head->next == nullptr) return head;
        ListNode *newHead = new ListNode(0);
        newHead->next = head;
        ListNode *prev = newHead, *cur = newHead->next;
        ListNode *next = cur->next, *nnext = cur->next->next;
        while(cur && next)
        {
            prev->next = next;
            next->next = cur;
            cur->next = nnext;

            prev = cur;
            cur = nnext;
            if(cur) next = cur->next;
            if(next) nnext = next->next;
        }
        cur = newHead->next;
        delete newHead;
        return cur;
    }
};

重排链表

  • 题目链接

重排链表icon-default.png?t=O83Ahttps://leetcode.cn/problems/reorder-list/description/

  • 算法原理

  • 代码步骤
/**
 * 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:
    void reorderList(ListNode* head) 
    {
        if(head == nullptr || head->next == nullptr || head->next->next == nullptr)
        {
            return;
        }

        // 找到中间结点
        ListNode* slow = head, *fast = head;
        while(fast && fast->next)
        {
            slow = slow->next;
            fast = fast->next->next;
        }

        cout << slow->val << " " << slow->next->val << endl;

        // 逆序——头插
        ListNode* newHead = new ListNode(0);
        ListNode *cur = slow->next;
        slow->next = nullptr;
        while(cur)
        {
            slow->next = cur->next;
            cur->next = newHead->next;
            newHead->next = cur;

            cur = slow->next;
        }

        // 合并俩个链表
        ListNode *cur1 = head, *cur2 = newHead->next;
        ListNode* ret = new ListNode(0);
        cur = ret;
        while(cur1)
        {
            cur->next = cur1;
            cur = cur->next;
            if(cur1) cur1 = cur1->next;
            if(cur2)
            {
                cur->next = cur2;
                cur = cur->next;
                cur2 = cur2->next;
            }
        }

        head = ret->next;
        delete ret;
        delete newHead;
    }
};

合并k个升序链表

  • 题目链接

合并k个升序链表icon-default.png?t=O83Ahttps://leetcode.cn/problems/merge-k-sorted-lists/

  • 算法原理

  • 代码展示
/**
 * 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 {
    struct cmp
    {
        bool operator()(ListNode* l1, ListNode* l2)
        {
            return l1->val > l2->val;
        }
    };
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
        priority_queue<ListNode*, vector<ListNode*>, cmp> heap;
        for(auto ch : lists)
        {
            if(ch) heap.push(ch);
        }

        ListNode* newHead = new ListNode(0);
        ListNode* prev = newHead;
        while(!heap.empty())
        {
            ListNode* tmp = heap.top();
            heap.pop();

            prev->next = tmp;
            prev = tmp;
            if(tmp->next) heap.push(tmp->next);
        }

        prev = newHead->next;
        delete newHead;
        return prev;
    }
};

k个一组翻转链表

  • 题目链接

k个一组翻转链表icon-default.png?t=O83Ahttps://leetcode.cn/problems/reverse-nodes-in-k-group/description/

  • 算法原理

  • 代码展示
/**
 * 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* reverseKGroup(ListNode* head, int k) {
        
        // 计算翻转次数
        int n = 0;
        ListNode *tmp = head;
        while(tmp)
        {
            tmp = tmp->next;
            n++;
        }
        n = n / k;
        
        ListNode newHead;
        newHead.next = nullptr;
        ListNode *prev = &newHead, *cur = head;
        
        for(int i = 0; i < n; i++)
        {
            tmp = cur;
            for(int j = 0; j < k; j++)
            {
                ListNode *next = cur->next;
                cur->next = prev->next;
                prev->next = cur;
                cur = next;
            }
            prev = tmp;
        }
        
        prev->next = cur;
        
        cur = newHead.next;
        return cur;
    }
};

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

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

相关文章

电力领域大模型

2023年12月&#xff0c;arXiv预印本平台发表了一篇题为"Large Foundation Models for Power Systems"的研究论文。该文系统探讨了大型基础模型如大型语言模型&#xff08;LLMs&#xff09;在电力系统建模和运行中的应用前景。研究重点关注了大型基础模型在最优潮流计…

php+mysql安装

1.卸载mysql 没启动不停止 2.下载 3.解压 4.点击安装 5.出现成功 端口占用修改 修改端口89或者87 可视化扩展 修改后重启 开启扩展

consul注册中心与容器自动发现实战

consul简介 Consul 是 HashiCorp 公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案&#xff0c;不再需要依赖其它工具&#xff08;比如 ZooKeeper 等&#xff0…

springboot快速开发平台使用达梦数据库

1.首先来到DM管理工具 大致流程是&#xff1a;创建表空间&#xff08;用于给新建的用户使用&#xff09;-》创建用户&#xff08;绑定表空间&#xff09; 文件位置 2.创建用户 来到所属角色页面&#xff0c;第一个权限管理员一定要勾上&#xff0c;其他的看情况 3.来到DM数…

9.24每日作业

1> 思维导图 2> 将昨天的My_string类中的所有能重载的运算符全部进行重载 、[] 、>、、>) 3> 仿照stack类实现my_stack,实现一个栈的操作 text.h #ifndef LIST_H #define LIST_H #include <iostream> #include <string.h>using namespace std;…

Java项目: 基于SpringBoot+mybatis+maven医疗病历交互系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven医疗病历交互系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

力扣 简单 206.反转链表

文章目录 题目介绍题解 题目介绍 题解 法一&#xff1a;双指针 在遍历链表时&#xff0c;将当前节点的 next 改为指向前一个节点。由于节点没有引用其前一个节点&#xff0c;因此必须事先存储其前一个节点。在更改引用之前&#xff0c;还需要存储后一个节点。最后返回新的头引…

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》&#xff0c;2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W&#xff0c;而私营单位就业人员平均月薪只有5.7K左右。 图源&#xff1a;…

1. 值、类型与运算符

在计算机的世界里&#xff0c;只有数据。你可以读取数据、修改数据、创建新数据&#xff0c;但不能提及非数据的内容。所有这些数据都存储为长位序列&#xff0c;因此本质上是相似的。 位&#xff08;比特&#xff09;是任何类型的二值事物&#xff0c;通常被描述为0和1。在计算…

Maya学习笔记:软选择

文章目录 打开软选择调整软选择范围衰减模式 软选择可以很好的进行渐变修改 打开软选择 方法1&#xff1a; 进入点线面模式&#xff0c;按B键进入软选择模式&#xff0c;再按B取消 方法2&#xff1a;双击左侧的选择按钮打开选择面板&#xff0c;勾选软选择 调整软选择范围 …

hadoop大数据平台操作笔记(上)

Hadoop介绍 Hadoop是一个开源的分布式系统框架&#xff0c;专为处理和分析大规模数据而设计。它由Apache基金会开发&#xff0c;并通过其高可靠性、高扩展性、高效性和高容错性等特性&#xff0c;在大数据领域发挥着重要作用。以下是对Hadoop的详细解释及其用途的概述&#xf…

分享6个icon在线生成网站,支持AI生成

在这个数字化的时代&#xff0c;创意和视觉标识在产品推广中可谓是愈发重要。提到图标&#xff0c;我们就不能不聊聊“Icon”这个小家伙。它不仅仅是个简单的视觉元素&#xff0c;简直是品牌信息的超级传递者。因此&#xff0c;图标生成器成了设计界的“万金油”&#xff0c;帮…

【赵渝强老师】K8s的DaemonSets控制器

DaemonSet控制器相当于在节点上启动了一个守护进程。通过使用DaemonSet可以确保一个Pod的副本运行在 Node节点上。如果有新的Node节点加入集群&#xff0c;DaemonSet也会自动给新加入的节点增加一个Pod的副本&#xff1b;反之&#xff0c;当有Node节点从集群中移除时&#xff0…

1.4 边界值分析法

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 定义2 选取3 具体步骤4 案例分析 本篇文章参考黑马程序员 前言 边界值分析法是一种广泛应用于软件测试中的技术&#xff0c;旨在识别输入值范围内的潜在缺陷。本文将详细探讨…

一.python入门

gyp的读研日记&#xff0c;哈哈哈哈&#xff0c;&#x1f642;&#xff0c;从复习python开始&#xff0c; 目录 1.python入门 1.1 Python说明书 1.2 Python具备的功能 1.3 学习前提 1.4 何为Python 1.5 编程语言 2.Python环境搭建 2.1 开发环境概述 2.2 Python的安装与…

离线一机一码验证和网络验证的区别以及使用场景

本文主要介绍离线一机一码验证和网络验证的区别及其各自的特点和优势。通过对比这两种验证方式的工作原理、优缺点&#xff0c;使开发人员更好地理解并选择适合自己需求的验证方案。接下来&#xff0c;我们将详细探讨每种验证方式的具体实现和应用场景。 离线一机一码验证 和 网…

告别旋转手机:SLAM过程中的磁力计标定

1.论文信息 论文标题&#xff1a;Saying goodbyes to rotating your phone: Magnetometer calibration during SLAM 作者&#xff1a;Ilari Vallivaara, Yinhuan Dong, Tughrul Arslan 作者单位&#xff1a;爱丁堡大学 论文链接&#xff1a;https://arxiv.org/pdf/2409.0124…

虚拟机环境控制中心显示未激活问题

统信服务器操作系统【免费授权版】虚拟机环境控制中心显示未激活问题解决方案 文章目录 问题现象问题原因解决方案相关建议 问题现象 正常情况下服务器免费授权版系统中应该会显示“免费授权”&#xff0c;并且不会出现未激活的提示。 问题现场发现系统显示未激活&#xff0c…

船只类型识别系统源码分享

船只类型识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

ubuntu安装SFML库+QT使用SFML库播放声音

(1)ubuntu安装SFML库 sudo apt-get install libsfml-dev (2)QT使用SFML库播放声音 在.pro文件中添加头文件路径和库文件路径 INCLUDEPATH /usr/include/SFML LIBS /usr/lib/x86_64-linux-gnu/libsfml*.so UI界面中创建一个pushbutton按钮&#xff0c;并且创建槽函数 加载…