当前位置: 首页 > news >正文

力扣DAY30 | 热100 | 两两交换链表中的节点

前言

中等 √ tail,fir,sec三个指针迭代完成。

题目

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

思路

fir指针指向第一个,sec指针指向第二个,tail指针指向已处理好的序列尾部。进入循环,尾部next指针指向sec,fir的next指针把sec的next位置存下,sec的next指针指向fir,更新tail、fir和sec位置。要考虑好所有边界情况。

我的题解

/**
 * 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 dummy(0);
        ListNode* tail = &dummy;
        ListNode* fir = head;
        ListNode* sec = fir;

        if (!fir || !fir->next){
            return head;
        }

        while (fir && sec->next && fir->next){
            sec = fir->next;
            tail->next = sec;
            fir->next = sec->next;
            sec->next = fir;
            tail = fir;
            fir = fir->next;
        }

        return dummy.next;
    }
};

官方题解

迭代与笔者一致,这里放一下递归的解法

可以通过递归的方式实现两两交换链表中的节点。

递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。

如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。

用 head 表示原始链表的头节点,新的链表的第二个节点,用 newHead 表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是 newHead.next。令 head.next = swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为 head 的下一个节点。然后令 newHead.next = head,即完成了所有节点的交换。最后返回新的链表的头节点 newHead。

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;
    }
};

心得

总是学不会怎么写一个好的递归,这方面的思维需要再培养。另外迭代也是,虽然做出来了但是不够它写的美观,问题抽象得不够好。

相关文章:

  • LeetCode hot 100 每日一题(17)——160.相交链表
  • 算法--动态规划
  • 给聊天机器人装“短期记忆“:Flask版实现指南
  • Dubbo(18)Dubbo的SPI机制是什么?
  • Rocky linux部署DNS服务
  • GPU服务器集群网络规划方案
  • 阿里云数据学习20250327
  • 面试八股文--框架篇(SSM)
  • Nginx RTMP MP4 模块分析
  • 【9】Strongswan collections —— enumerator
  • C# 操作html下的css样式
  • 数制——FPGA
  • 【2025】基于springboot+vue的自习室管理系统的设计与实现(源码、万字文档、图文修改、调试答疑)
  • notepad++代码查看器分享
  • Qt 日志输出(重定向)
  • Android 底部EditView输入时悬浮到软键盘上方
  • 智能提示词生成器:助力测试工程师快速设计高质量测试用例
  • 网络安全法律法规简介
  • Kafka拦截器
  • Kafka 的高可用性
  • 网站建设公司的公众号/广告牌
  • 网页设计与网站建设基础/网络工程师培训班要多少钱
  • 澳门响应式网站建设/深度优化
  • h5做网站用什么框架/网络广告推广服务
  • 官方网站minecraft/seo顾问是干什么
  • 美国亚马逊网站如何做/站长之家排名查询