玩命加载中 . . .

两两交换链表中的节点


描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

img

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

输入:head = []
输出:[]
示例 3:

输入:head = [1]
输出:[1]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/swap-nodes-in-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

这个解决方案的思路是创建一个虚拟头节点,然后使用一个指针“cur”来迭代链表。对于每一对相邻的节点,我们交换它们的位置。

具体来说,我们使用三个指针:第一个指针“cur”指向虚拟头节点,第二个指针“first”指向当前要交换的第一个节点,第三个指针“second”指向当前要交换的第二个节点。我们首先将“cur->next”指向“second”,然后将“first”指向“second->next”,最后将“second->next”指向“first”。然后我们将“cur”移动到下一对相邻节点的位置,重复上述步骤,直到我们到达链表的末尾。

最后,我们返回虚拟头节点的下一个节点,这是交换后的新链表的头节点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummy = new ListNode(0); // 创建一个虚拟头节点
        dummy->next = head;
        ListNode* cur = dummy;
        while (cur->next && cur->next->next) {
            ListNode* first = cur->next;
            ListNode* second = cur->next->next;
            cur->next = second;
            first->next = second->next;
            second->next = first;
            cur = cur->next->next;
        }
        return dummy->next;
    }
};

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录