力扣刷题Day2

embedded/2024/11/13 3:30:58/

题目链接:

24. 两两交换链表中的节点 - 力扣(LeetCode)

效果:

解题思路:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

注意不可以只是单纯的改变节点内部的值,而是需要实际的对两个节点交换。

那需要有一定的交换顺序,先让12交换,其中交换时的顺序为,先把2放在开头,然后让1指向2的下一个结点,然后2再接1

这里使用虚拟结点比较好。第一步就是让虚拟结点指向2,然后接着上述步骤

 然后1和2交换完之后,再接着把指针移到3的位置,让虚拟结点的下一个为3,接着按上述步骤执行,直到没有需要交换的即可

文字版分析好了,现在来看代码

使用的语言为c语言:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* swapPairs(struct ListNode* head) {if(!head||!head->next){return head;}struct ListNode* cur=(struct ListNode *)malloc(sizeof(struct ListNode));cur->next=head;struct ListNode* q=head;struct ListNode* p=cur;while(p&&q&&q->next){p->next=q->next;q->next=p->next->next;p->next->next=q;p=q;//q=p->next;}return cur->next;
}

这个代码其中有很多地方需要注意:

1. 为什么要先建一个指针p来存储cur这个虚拟指针呢?

原因是——当转换链表后之前的head指针指向的不是链表的开头了,这时候要是返回head指针就不对了,而且如果只用cur指针的画,cur指针也在不断变换着,没办法保证返回的是整个链表。

2.为什么要让while循环的条件有q->next?

首先q是指向p指针的下一个结点的,而p结点是指向需要互换的第一个结点(就比如1、2中的1和3、4中的3)

在某种情况下(12345的情况),如果把3、4交换完,则p指向3,q指向5,5是不需要再交换的,这时候其实就可以退出了。所以条件上要加一个q->next

方法2:递归法:

这里由于每两个的步骤都是一样的,所以可以使用递归的方法来完成,当头结点不存在或者下一个结点不存在则不需要交换了。

struct ListNode* swapPairs(struct ListNode* head){//头节点不存在或头节点的下一个节点不存在。此时不需要交换,直接返回headif(!head || !head->next)return head;//创建节点-指针类型来保存头结点下一个节点struct ListNode *newHead = head->next;//更改头结点加2位节点后的值,将头结点的next指针指向这个更改过的listhead->next = swapPairs(newHead->next);//将新的头结点的next指针指向老的头节点newHead->next = head;return newHead;
}

 


http://www.ppmy.cn/embedded/23835.html

相关文章

【MHA】MySQL高可用MHA介绍4-故障监控与切换具体流程

目录 一 故障监控与切换 1 验证复制设置并识别当前主服务器 2 监控主服务器 3 检测主服务器故障 4 再次验证从服务器配置 5 关闭故障的主服务器(可选) 6 恢复新主服务器 6.1 保存来自 已崩溃主服务器的二进制日志事件(如果可能&#…

第11章 Android特色开发——基于位置的服务

第11章 Android特色开发——基于位置的服务 本章中,将要学习一些全新的Android技术,这些技术有别于传统的PC或Web领域的应用技术,是只有在移动设备上才能实现的。 基于位置的服务(Location Based Service)。由于移动…

Ansible一键部署zabbix+grafana+agent

目录 IP地址规划ansible安装分开部署安装zabbix-mysql安装zabbix-server安装zabbix-agent安装zabbix-grafana 一键部署自动发现 IP地址规划 名字地址主要安装软件ansible-server192.168.40.137zabbix-server、ansible、zabbix-mysqlzabbix-agent1192.168.40.138zabbix-agentza…

c++ new delete 相关应用——申请连续空间不允许部分释放

new delete 详解 实验1 int **all_a new int* [2]; // 申请了一片空间足够存储两个int类型指针。// 返回对象是指向空间头的指针,因此是int**int* a new int [3];//申请了足够存储3个int 的空间,返回空间开始位置的指针 int* b new int [3];//申请了…

什么是环比折年率

环比折年率是月度(或季度)统计中一个十分重要的统计指标,由环比增速推算得到,用于反映经济的发展速度与趋势变化。环比折年率与同比增速相比具有对趋势变化灵敏度高的优点,在统计分析、趋势预测等领域有着广泛应用。 …

STM32用HAL库函数实现硬件IIC

/*出处:【STM32入门教程-2024】第12集 IIC通信与温湿度传感器AHT20(DHT20)_哔哩哔哩_bilibili */ AHT20驱动 这篇笔记我主要介绍代码实现,想要了解原理的请自己看视频,我不过多赘述了。 AHT20通信数据帧格式: ①对照手册上的通…

游戏新手村17:游戏市场营销的分类

营销(Marketing),港台地区译为行销/市场行销。根据美国营销学会(AMA) 2008年的定义,市场营销是创造、传播、交付和交换那些对顾客、客户、合作伙伴和社会有价值的市场供应物的活动、制度和过程。可以简单理…

代码随想录训练营26day-贪心算法4

一、860 柠檬水找零 题目解析:注意一开始是没有零钱,也只会取5 10 20三类数字,因此从这3类数字出发,去判断。 1 如果是5元,那么直接收,five; 2 如果是10元,那么需要five--&#x…