力扣:24两两交换链表的节点

目录

1.题目描述:

2.算法思路:

3.代码展示:


1.题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

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

2.算法思路:

给定的代码是一个C++函数,名为swapPairs,接受一个ListNode*类型的头节点指针head,返回交换后的链表头节点。代码的主要步骤如下:

  1. 创建一个虚拟头节点dummy,其next指向head
  2. 初始化一个指针temp指向dummy
  3. 使用while循环,条件是temp->nexttemp->next->next都不为空。
  4. 在循环内部:
    • 定义node1temp->next
    • 定义node2temp->next->next
    • 调整指针:
      • temp->next指向node2
      • node1->next指向node2->next
      • node2->next指向node1
    • 移动tempnode1
  5. 返回dummy->next,即交换后的链表头节点。

逐步解析

让我们通过一个具体的例子来逐步解析代码的执行过程。假设输入链表为:1 -> 2 -> 3 -> 4。

​初始状态:​

dummy(0) -> 1 -> 2 -> 3 -> 4
temp = dummy

​第一次循环:​

  • node1 = temp->next = 1
  • node2 = temp->next->next = 2

调整指针:

  1. temp->next = node2dummy(0) -> 2
  2. node1->next = node2->next1 -> 3
  3. node2->next = node12 -> 1

此时链表:

dummy(0) -> 2 -> 1 -> 3 -> 4
temp = node1 = 1

​第二次循环:​

  • node1 = temp->next = 3
  • node2 = temp->next->next = 4

调整指针:

  1. temp->next = node21 -> 4
  2. node1->next = node2->next3 -> nullptr(因为node2->next4的下一个,为空)
  3. node2->next = node14 -> 3

此时链表:

dummy(0) -> 2 -> 1 -> 4 -> 3
temp = node1 = 3

​第三次循环:​

检查temp->nexttemp->next->next

  • temp->next3->next,即nullptr
  • 不满足循环条件,退出循环。

​返回结果:​

dummy->next指向2,即交换后的链表头节点。

最终链表:2 -> 1 -> 4 -> 3

3.代码展示:

ListNode* swapPairs(ListNode* head) {
    //创建一个头节点,便于后续的操作
    ListNode* dummy = new ListNode(0);
    ListNode* temp = dummy;
    
    //temp的下一个节点和temp的下一个的下一个节点,同时存在才可以进行交换操作
    while (temp->next && temp->next->next)
    {
        ListNode* node1 = temp->next;
        ListNode* node2 = temp->next->next;

        temp->next = node2;
        node1->next = node2->next;
        node2->next = node1;
        temp = node1;
    }

    return dummy->next;
}

24. 两两交换链表中的节点 - 力扣(LeetCode)https://leetcode.cn/problems/swap-nodes-in-pairs/description/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值