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

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

 

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

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

方法1 递归:

思路:LeetCode题解 + 下方流程图(processon制作,流程图链接

时间复杂度: O(N),其中 N 指的是链表的节点数量

空间复杂度: O(N),递归过程使用的堆栈空间

ListNode* swapPairs(ListNode* head) {
    // 1.递归
    if(head == NULL || head->next == NULL) 
        return head; //终止条件
    ListNode* node = head->next; 
    head->next = swapPairs(head->next->next);
    node->next = head;
    return node;

    // 2.交换值(不符合题目要求:不能改变节点内部的值)
    // ListNode* quick = NULL;					// error: head->next->next;
    // ListNode* slow = head->next;
    // while (slow != NULL)
    // {
    //     quick = slow->next;				// 先让quick等于slow下一个,循环最后slow跳next。

    //     int tmp = quick->val;
    //     quick->val = slow->val;
    //     slow->val = tmp;

    //     slow = quick->next;
    //     //quick = quick->next->next;	// 不能直接在最后quick = quick->next->next;连续两个以上next有可能会报错,不好控制
    // }
    // return head;
}

 方法2 迭代法:

思路:LeetCode题解 + 某大佬视频讲解 + 本人下方代码注释

时间复杂度: O(N),其中 N 指的是链表的节点数量

空间复杂度: O(1)

// 迭代法:
ListNode* swapPairs(ListNode* head) {
   while (head != NULL && head->next != NULL)      // 只有head和head后面,前后两个几点都不为NULL的时候才能进行节点的交换
        {
            ListNode* first = head;
            ListNode* second = head->next;

            // 处理每两个一组之间的反转
            head->next = second->next;                  // 图片中的步骤①
            second->next = first;                       // 图片中的步骤②
            prev->next = second;                        // 图片中的步骤③    错误:prev = second; // 虚拟头节点prev指向下一组的新的头节点

            // 后移指针
            prev = first;                               // 错误:prev = second; // 因为先前的first和second节点交换了位置(second在前,first在后),prev 相当于下一组两个待交换节点的first的前一个节点
            head = first->next;                         // second -> first -> first1 -> second1   (假设下一组待交换节点的前一个为first1,后一个为second1),所以head重新指向下一组的first1
        }

        return virtualHead->next;                       // 返回最开始保留的虚拟头节点virtualHead的next
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值