两两交换链表中的节点

两两交换链表中的节点

方法一:递归

class Solution {
public:
  ListNode* swapPairs(ListNode* head) {
    if (!head || !head->next) return head;

    ListNode* next = head->next;
    head->next = next->next;
    next->next = head;

    head = next;

    head->next->next = swapPairs(head->next->next);

    return head;
  }
};

解释:

  1. 递归终止条件:当链表为空或只有一个节点时,直接返回。
  2. 递归步骤:
    • 交换当前链表的第一个和第二个节点。
    • 将递归结果连接到交换后的第二个节点之后。
    • 返回交换后的第一个节点。

方法二:迭代

class Solution {
public:
  ListNode* swapPairs(ListNode* head) {
    ListNode* dummy = new ListNode(0);
    dummy->next = head;

    ListNode* prev = dummy;
    while (head && head->next) {
      ListNode* next = head->next;
      head->next = next->next;
      next->next = head;

      prev->next = next;
      prev = head;
      head = head->next;
    }

    return dummy->next;
  }
};

解释:

  1. 创建一个虚拟头节点 dummy,指向原链表的头节点。
  2. 使用两个指针 prev 和 head 分别指向当前链表的前一个节点和当前节点。
  3. 循环遍历链表,每次交换相邻的两个节点:
    • 将 head 的下一个节点赋值给 next
    • 将 head 的下一个节点指向 next 的下一个节点。
    • 将 next 的下一个节点指向 head
  4. 将 prev 的下一个节点指向交换后的 next 节点。
  5. 将 prev 指向 head
  6. 将 head 指向 head 的下一个节点。
  7. 循环结束之后,返回 dummy 的下一个节点,即交换后的链表的头节点。

两种方法的复杂度分析:

  • 时间复杂度:O(n),其中 n 是链表的长度。
  • 空间复杂度:O(1)

代码示例:

#include <iostream>

using namespace std;

struct ListNode {
  int val;
  ListNode* next;

  ListNode(int x) : val(x), next(nullptr) {}
};

void printList(ListNode* head) {
  while (head) {
    cout << head->val << " ";
    head = head->next;
  }
  cout << endl;
}

int main() {
  ListNode* head = new ListNode(1);
  head->next = new ListNode(2);
  head->next->next = new ListNode(3);
  head->next->next->next = new ListNode(4);

  Solution s;
  ListNode* newHead = s.swapPairs(head);

  printList(newHead);

  return 0;
}

输出:2 1 4 3

相关推荐

  1. 交换节点

    2024-03-11 01:56:02       57 阅读
  2. leetcode24. 交换节点

    2024-03-11 01:56:02       66 阅读
  3. LC24. 交换节点

    2024-03-11 01:56:02       69 阅读
  4. LeetCode [24] 交换节点

    2024-03-11 01:56:02       67 阅读
  5. 【Leetcode】24. 交换节点

    2024-03-11 01:56:02       64 阅读
  6. LeetCode24.交换节点

    2024-03-11 01:56:02       66 阅读
  7. 交换节点

    2024-03-11 01:56:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 01:56:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 01:56:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 01:56:02       82 阅读
  4. Python语言-面向对象

    2024-03-11 01:56:02       91 阅读

热门阅读

  1. leetcode10--正则表达式

    2024-03-11 01:56:02       45 阅读
  2. shell启动jar 包脚本

    2024-03-11 01:56:02       38 阅读
  3. Spring文件上传下载代码

    2024-03-11 01:56:02       42 阅读
  4. C++ QT 嘴试题--集锦

    2024-03-11 01:56:02       33 阅读
  5. 使用route的reject拒绝境外ip通信

    2024-03-11 01:56:02       41 阅读
  6. Linux 内核中处理阻塞访问的方法:等待队列

    2024-03-11 01:56:02       47 阅读
  7. 自定义组件v-model传值方法

    2024-03-11 01:56:02       44 阅读
  8. Android下使用OpenOCD

    2024-03-11 01:56:02       37 阅读
  9. AJAX-查询参数

    2024-03-11 01:56:02       35 阅读