24.两两交换链表中的节点

1.题目介绍

题目地址(24. 两两交换链表中的节点 - 力扣(LeetCode))

https://leetcode.cn/problems/swap-nodes-in-pairs/

题目描述

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

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

2.题解

2.1 递归

思路

抓住两个关键点:1.何时终止递归:为空或者是只有一个节点时均无法进行交换(至少两个节点) 2. 如何交换:设置一个newhead,其next指向head;而head的next指向原来newhead的next,但注意这里newhead的next的两个节点也进行了交换,所以使用递归的方式指向交换过的节点

代码

/**
 * 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) {
      if (head == nullptr || head -> next == nullptr) return head;
      ListNode* newhead = head -> next;
      head -> next = swapPairs(newhead->next);
      newhead->next = head;
      return newhead;
    }
};

2.2 迭代

思路

总体思路是使用一个临时节点指针temp指向要交换两个节点的前一个节点(对于首节点和第二节点创建一个哑结点,三个节点方便链表交换!!!)
然后temp不断向后遍历,直到后面没有节点或者只有一个节点无法交换.

代码

/**
 * 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* dummyHead = new ListNode(0, head);
        ListNode* temp = dummyHead;
        while (temp->next != nullptr && temp->next->next != nullptr) {
            ListNode* node1 = temp->next;
            ListNode* node2 = temp->next->next;
            temp->next = node2;
            node1->next = node2->next;
            node2->next = node1;
            temp = temp->next->next;
        }
        ListNode* ans = dummyHead->next;
        delete dummyHead;
        return ans;
    }
};
posted @   DawnTraveler  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示