您现在的位置是:首页 >技术教程 >算法-链表篇04-两两交换链表中的节点网站首页技术教程

算法-链表篇04-两两交换链表中的节点

Buling_0 2026-04-05 00:01:05
简介算法-链表篇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;
    }
};

总结

这道题做起来非常头秃,虽然思路一开始就确定了,但是在做题的过程中,遇到了很多细节上的问题。希望大家都可以尝试着自己写一下,可以在过程中发现很多理论上注意不到的地方。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。