OJ 两两交换链表中的节点

题目:

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

示例:

代码分析:

class Solution {
public:
    ListNode*_swap(ListNode*cur)
    {
        //判断当前节点是否是空的(cur一开始是接收头节点,同时后面还会接收未节点),
        //如果是空的则直接返回
        if(cur==nullptr) return nullptr;

        //如果该节点的下一个是空,那么没有交换的必要
        if(cur->next==nullptr) return cur;
 
        //设置当前节点的后一个节点的后一个节点,这样方便指针的指向和之后的递归操作
        ListNode*_next=cur->next->next;

        //记录当前节点的下一个节点
        ListNode* second = cur->next;

        //进行节点指向的改变,将当前节点的后一个节点的后一个节点的 next指针指向当前节点
        cur->next->next =cur;//也就是让当前节点的 下一个节点 的next指针指向当前节点

        //利用递归操作进行递归当前节点的下一个节点
        cur->next = _swap(_next);

        最后返回
        return second;
    }
    ListNode* swapPairs(ListNode* head) {
        return _swap(head);
    }
};
  • 根据示意图可以得出,链表上的节点是前后节点进行交换的,所以需要该动前后节点的指针指向,这里使用递归的方式进行改动。
  • swap(ListNode* cur)
    • 这是一个递归函数,用于递归地处理链表,直到链表结束(即遇到 nullptr 或只有一个节点时)。
    • 函数的参数 cur 是当前正在处理的节点。
    • 如果 cur 是 nullptr 或 cur->next 是 nullptr(即链表为空或只有一个节点),则函数直接返回 cur,因为没有节点对可以反转。
    • 否则,函数首先保存 cur->next->next(即当前节点的下一个节点的下一个节点,记作 _next)以便后续递归调用。
    • 然后,它执行“翻转”操作:将 cur->next 的 next 指针指向 cur,从而实现了一对节点的逻辑反转。
    • 接着,它递归地调用自身来处理剩余的链表(从 _next 开始)。
    • 最后,函数返回 cur->next,即新链表的头节点(因为 cur 和 cur->next 已经交换了位置)。
  • swapPairs(ListNode* head)
    • 这是对外的接口函数,用于启动反转每对节点的过程。
    • 它简单地调用了 _swap(head) 并返回结果。

 

题目来源:24. 两两交换链表中的节点 - 力扣(LeetCode)

 题解来自于:Lucifer厄同_roc. - 力扣(LeetCode)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值