代码随想录算法训练营第四天-链表-24. 两两交换链表中结点

news/2024/12/20 17:49:04/
  • 重点是使用虚拟头结点,这样如果整个链表是个空链表,处理起来也会保持代码一致
  • 内部处理过程是一个复杂过程
    • 要定义一个当前结点,要通过这个当前结点cur,把其后要交换的两个结点获取到
    • 通过当前结点,定义两个变量,node_1st,和node_next_1st
      • node_1st = cur->next;表示要交换的第一个结点
      • node_next_1st = cur->next->next->next;表示在交换区域外的准备交换的第一个结点
      • 交换区域外是指准备交换两个结点之外的,准备下一次交换两个结点所在区域
    • 交换过程:
      • cur->next = cur->next->next;让当前结点指向交换区域的第二个结点,也就是与第一个结点断开链接
      • cur->next->next = node_1st;让原第二个结点指向原第一个结点(链接反转)
      • node_1st->next = node_next让原第一个结点指向交换区域外的第一个结点,这个代码相比于老师提供的做了优化,要检测是否正确
      • cur = node_1st;让当前结点移动到已经交换位置后的第二个结点上,也就是让其移动到准备下一次交换的两个结点前的一个结点上
  • 上面的过程不看混是不可能的吧,可以参照网站的图片和B站上的视频来加深理解吧
#include <iostream>struct ListNode {int val;ListNode* next;ListNode(): val(0), next(nullptr) {}ListNode(int v): val(v), next(nullptr) {}ListNode(int v, ListNode* node): val(v), next(node) {}
};class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* visualHead = new ListNode(0);visualHead->next = head;for(ListNode* cur = visualHead, *node_1st, *node_next_1st; cur->next != nullptr && cur->next->next != nullptr; cur = node_1st) {node_1st = cur->next;node_next_1st = cur->next->next->next;cur->next = cur->next->next;cur->next->next = node_1st;node_1st->next = node_next_1st;}ListNode* ret_head = visualHead->next;delete visualHead;return ret_head;}void show(ListNode* head) {for (auto* p = head; p != nullptr; p = p->next)std::cout << p->val << " ";std::cout << std::endl;}
};
int main()
{ListNode* head = nullptr;for (int val; std::cin >> val; head = new ListNode(val, head));Solution s;head = s.swapPairs(head);s.show(head);return 0;
}
  • 测试数据:录入数据5 4 3 2 1 a,会生成1->2->3->4->5这样一个链表,字母a表示数据录入结束
  • 汇总

http://www.ppmy.cn/news/1556692.html

相关文章

超标量处理器设计笔记(11)发射内容:分配、仲裁、唤醒

发射 概述集中式和分布式数据捕捉和非数据捕捉数据捕捉非数据捕捉总结对比 压缩式和非压缩式压缩式发射队列非压缩式发射队列总结 发射过程的流水线非数据捕捉结构的流水线数据捕捉结构的流水线 分配仲裁1-of-M 的仲裁电路N of M 的仲裁电路 唤醒单周期指令的唤醒多周期指令的…

【优选算法---分治】快速排序三路划分(颜色分类、快速排序、数组第K大的元素、数组中最小的K个元素)

一、颜色分类 题目链接: 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 题目介绍&#xff1a; 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序…

vue3中el-table 复选框设置为单选,且可通过选择行选中复选框

场景需求一&#xff1a; el-table中自带的复选框组件&#xff0c;可以多选&#xff0c;但是目前我们只想要让用户选中一个&#xff0c;变成单选 <template><div><el-table ref"myTable" :data"tableData" selection-change"handleSe…

【漏洞复现】Grafana 安全漏洞(CVE-2024-9264)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 一、漏洞概述 1.1漏洞简介 漏洞名称:Grafana 安全漏洞 (CVE-2024-9264)漏洞编号:CVE-2024-9264 | CNNVD-202410-1891漏洞类型:命令注入、本地文件包含漏洞威胁等级:…

Gitee与idea的项目提交步骤

1. 准备工作 确保你已经安装了Git&#xff0c;并且你的计算机上已经配置了Git。如果你还没有安装Git&#xff0c;可以从Git官网下载并安装。 2. 创建Gitee账户和仓库 访问Gitee官网并注册一个账户&#xff08;如果你还没有的话&#xff09;。登录你的Gitee账户。点击右上角的…

欢乐堡游乐园信息管理系统的设计与实现(Django Python MySQL)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南

引言 在现代数据架构中&#xff0c;Kafka 作为一种高性能的消息队列系统&#xff0c;已被广泛应用于处理实时数据流。在企业级部署中&#xff0c;保证数据传输的安全性以及服务的稳定性变得尤为重要。本文将详细介绍如何在 Docker 环境下部署 Kafka 服务&#xff0c;并使用 Sy…

初学stm32 --- 外部中断

目录 STM32 IO 口中断基础知识 相关库函数&#xff1a; 使用 IO 口外部中断的一般步骤 STM32 IO 口中断基础知识 STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位&#xff0c;每个中断/事件都有独立…