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. };
目录
相关文章
|
13天前
|
算法 Java
[Java·算法·简单] LeetCode 283. 移动零
[Java·算法·简单] LeetCode 283. 移动零
17 2
|
13天前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
15 2
|
21天前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
5天前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
16天前
24. 两两交换链表中的节点
24. 两两交换链表中的节点
|
19天前
|
存储
删除链表的节点
删除链表的节点
10 0
|
21天前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
|
21天前
|
存储 SQL 算法
|
20天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
20天前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表