LeeCode 24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
答案&测试代码:
void testLeeCode24(void) { // LeeCode 24. 两两交换链表中的节点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) { // LeeCode 24. 两两交换链表中的节点// 方案: 将前俩个节点调换位置。 后面的部分也这么调用,递归实现。if (!head) return nullptr;ListNode *next = head->next;if (!next) return head;ListNode *last = next->next;next->next = head;last = swapPairs(last); // 递归后面部分head->next = last;return next;}};ListNode node1 = ListNode(1);ListNode node2 = ListNode(2);ListNode node3 = ListNode(3);ListNode node4 = ListNode(4);node1.next = &node2;node2.next = &node3;node3.next = &node4;Solution solution;ListNode* res = solution.swapPairs(&node1);// 打印链表std::cout << "链表:";for (ListNode *p = res; p; p = p->next) {std::cout << p->val << " ";}std::cout << endl;
}
打印:
ok. 提交到LeeCode:
ok.