leetcode24-两两交换链表中节点--Java解法

简介: leetcode24-两两交换链表中节点--Java解法

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

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

输入:head = [1,2,3,4]

输出:[2,1,4,3]

示例 2:

输入:head = []

输出:[]

示例 3:

输入:head = [1]

输出:[1]

 

提示:

链表中节点的数目在范围 [0, 100] 内

0 <= Node.val <= 100

 

解法:

通过设置奇偶标志对链表进行交换操作

根据题意,我们发现当链表走到奇数点时,节点与后面的节点进行交换,然后去往下一位;当走到偶数点时,不进行交换,直接走到下一位。通过设置一个标志,标记当前的节点的奇偶性,我们就可以对链表进行交换操作了。

注意一点,我们一开始设置p为头节点,只有当p和p->next != null时才可以进入while循环,二者缺一不可。且我们的循环条件为p->next != null,是为了应对链表整体为奇数的情况,链表走到最后,使得p->next不等于null,避免p和下一位不存在的节点进行交换,出现bug。

时时间复杂度o(n)

空间复杂度为o(1)

代码:

1. 
2. class Solution {
3. public:
4.     int cnt = 1,temp;
5.     ListNode* swapPairs(ListNode* head) {
6.         ListNode* p = new ListNode;
7.         p = head;
8. if(p == nullptr) return head;
9. if(!p->next) return head;
10.         while(p->next)
11.         {
12. if(cnt % 2 == 1){
13.                 temp = p->val;
14.                 p->val = p->next->val;
15.                 p->next->val = temp;
16.                 p = p->next;
17.                 cnt++;
18.             }
19. else{
20.                 p = p->next;
21.                 cnt++;
22.             }
23.         }
24. 
25. return head;
26.     }
27. };
目录
相关文章
|
11月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
595 10
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
312 1
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
278 0
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
431 0
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
281 0
LeetCode第二十四题(两两交换链表中的节点)
|
11月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
583 1
|
11月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
506 1
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
519 0