数据结构算法之链表篇:两两交换链表中的元素的实现

1.1 、问题描述:两两交换链表中的节点

力扣题目链接(opens new window)https://leetcode.cn/problems/swap-nodes-in-pairs/

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

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

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

输入:head = []
输出:[]
示例 3:

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

1.2、链表两两交换思路(极简版)

  1. 先搞个 “虚拟头结点” 挂在链表最前面 —— 这样不用单独处理真正的头结点(它没有前一个指针,不搞虚拟头会很麻烦)。
  2. 一定要画图!交换时要动好几个指针,不画图标清楚,很容易把链表 “扯断”。
  3. 让 curr 指针先指向虚拟头结点,然后重复三步(直到 cur 后面没两个节点可换):
    • 先记住三个点:curr 后面要换的两个节点(叫 node1、node2),还有 node2 后面的节点(叫 nextNode);
    • 让 node2 的 next 指向 node1(先把俩节点反过来连);
    • 让 node1 的 next 指向 nextNode、cur 的 next 指向 node2(把交换好的节点和前后链表接顺);
  4. 把 cur 移到 node1 的位置,继续处理下一组,直到结束。(下面是示意图

1.3 、指针交换示意图:

2.1、代码实现 

public ListNode swapPairs(ListNode head) {
    // 递归终止条件:如果链表为空,或者只剩一个节点(没有下一个节点可交换),直接返回当前节点
    // 这一步保证了递归不会无限进行,也是最小子问题的解(无需交换)
    if (head == null || head.next == null) {
        return head;
    }
    
    // 记录当前节点的下一个节点(即要和head交换的节点)
    // 比如链表是1->2->3->4,这里head是1,next就是2(后续会成为交换后的新头)
    ListNode next = head.next;
    
    // 递归处理"当前两个节点之后的子链表",得到交换后的子链表头节点
    // 以上面的例子,就是处理3->4,递归后会返回交换后的4(子链表变成4->3)
    ListNode newLinked = swapPairs(next.next);
    
    // 交换当前的两个节点:让第二个节点(next)指向第一个节点(head)
    // 此时2->1(原本是1->2)
    next.next = head;
    
    // 让第一个节点(head)指向后面处理好的子链表
    // 此时1->4(连接前面的2->1和后面的4->3)
    head.next = newLinked;
    
    // 交换后,原本的第二个节点(next)成为了当前子链表的新头,返回给上一层递归
    // 比如第一层递归后返回2,最终链表变成2->1->4->3
    return next;
}

个人总结学习用,对部分内容进行了简单的处理和归纳,如有谬误,希望大家指出,
持续修订更新中。

参考文档:

  1. 程序员 Carl. 代码随想录(LeetCode 数据结构与算法刷题攻略)(EB/OL). https://www.programmercarl.com/,2025-02/2025-10.
  2. 《数据结构》课程教学大纲(2024 版)(EB/OL). https://m.book118.com/html/2024/0423/8110022111006061.shtm,2024-04/2025-10.
  3. 《数据结构》课程教学大纲(软件工程专业)(EB/OL). https://m.renrendoc.com/paper/329728026.html,2024-05/2025-10.
  4. 程序员 Carl. LeetCode-Master(代码随想录刷题攻略 GitHub 仓库)(EB/OL). https://github.com/youngyangyang04/leetcode-master,2025-09/2025-10.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值