政府网站栏目建设规范网上软文发稿平台
两两交换链表中的节点
力扣题目链接
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
解题思路
这道题非常考验处理链表的灵活性,其中链表节点交换和后移的操作需要对多个节点进行有序的操作。
首先我们判断节点的长度,如果节点长度小于二,则不需要任何操作,直接返回;
创建两个节点指针分别指向第一个和第二个节点;
对最前两个节点进行交换;
如果剩余节点长度如果大于等于二,则可以进行循环操作:
- 首先创建一个临时节点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;}
};
总结
这道题做起来非常头秃,虽然思路一开始就确定了,但是在做题的过程中,遇到了很多细节上的问题。希望大家都可以尝试着自己写一下,可以在过程中发现很多理论上注意不到的地方。