题目

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

示例 1:
image.png

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

示例 2:

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

示例 3:

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

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

    解题方法

    虚拟头结点

    设定虚拟头结点指向头结点,然后遍历链表两两交换节点。
    时间复杂度O(n),空间复杂度O(1)
    C++代码:
    /**
    * Definition for singly-linked list.
    * struct ListNode {
    *     int val;
    *     ListNode *next;
    *     ListNode() : val(0), next(nullptr) {}
    *     ListNode(int x) : val(x), next(nullptr) {}
    *     ListNode(int x, ListNode *next) : val(x), next(next) {}
    * };
    */
    class Solution {
    public:
      ListNode* swapPairs(ListNode* head) {
          ListNode* _head = new ListNode();
          _head->next = head;
          ListNode* pre = _head;
          ListNode* cur = head;
          ListNode* next;
          while(cur && cur->next) {
              next = cur->next;
              cur->next = next->next;
              next->next = cur;
              pre->next = next;
              pre = cur;
              cur = cur->next;
          }
          return _head->next;
      }
    };