算法-链表篇04-两两交换链表中的节点
两两交换链表中的节点
力扣题目链接
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
解题思路
这道题非常考验处理链表的灵活性,其中链表节点交换和后移的操作需要对多个节点进行有序的操作。
首先我们判断节点的长度,如果节点长度小于二,则不需要任何操作,直接返回;
创建两个节点指针分别指向第一个和第二个节点;
对最前两个节点进行交换;
如果剩余节点长度如果大于等于二,则可以进行循环操作:
- 首先创建一个临时节点temp,用于保存已经交换完毕的节点的尾节点;
- 把两个指针都向后移动两位,指向未进行交换操作的前两个节点;
- 交换两个指针指向的节点,并续在temp后面。
题解
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(!head || !head->next){
return head;
}
ListNode* p1 = head;
ListNode* p2 = head->next;
head = p2;
p1->next = p2->next;
p2->next = p1;
while(p1->next != nullptr && p1->next->next != nullptr){
ListNode* temp = p1;
p1 = p1->next;
p2 = p1->next;
temp->next = p2;
p1->next = p2->next;
p2->next = p1;
}
return head;
}
};
总结
这道题做起来非常头秃,虽然思路一开始就确定了,但是在做题的过程中,遇到了很多细节上的问题。希望大家都可以尝试着自己写一下,可以在过程中发现很多理论上注意不到的地方。