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

文章目录

需求

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

示例 1:

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

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

输入:head = []

输出:[]
示例 3:

输入:head = [1]

输出:[1]
提示:

链表中节点的数目在范围 [0, 100] 内

0 <= Node.val <= 100

代码

java 复制代码
public ListNode swapPairs(ListNode head) {
    if( head == null || head.next == null ){
        return head;
    }
    ListNode preHead = new ListNode(-1, head);
    ListNode cur = preHead;
    while( cur.next != null && cur.next.next != null ){
        //  拿出前三个元素
        ListNode node1 = cur.next;
        ListNode node2 = node1.next;
        ListNode node3 = node2.next;
        
        //  交换
        node1.next = node3;
        node2.next = node1;
        cur.next = node2;
        //  重置 cur
        cur = node1;
    }
    return preHead.next;
}

代码解释

处理特殊情况:

如果链表为空或者只有一个节点,直接返回 head。因为在这种情况下没有必要进行交换。

java 复制代码
if (head == null || head.next == null) {
    return head;
}

初始化虚拟头节点:
ListNode preHead = new ListNode(-1, head);

创建一个虚拟头节点 preHead,它的 next 指向链表的实际头节点 head。这样做可以简化处理链表头部的交换操作。

初始化 cur 指针:

ListNode cur = preHead;

cur 指针用来跟踪当前处理的位置,最初指向 preHead。在交换过程中,cur 负责保持对链表已经交换部分的连接。

交换节点:

java 复制代码
while (cur.next != null && cur.next.next != null) {
    //  拿出前三个元素
    ListNode node1 = cur.next;
    ListNode node2 = node1.next;
    ListNode node3 = node2.next;
    
    //  交换
    node1.next = node3;
    node2.next = node1;
    cur.next = node2;
    
    //  重置 cur
    cur = node1;
}

提取三个节点:

node1:当前 cur 节点的下一个节点。

node2:node1 的下一个节点。

node3:node2 的下一个节点。

交换节点:

node1.next = node3:将 node1 的 next 指向 node3(即交换后 node1 之后的节点)。

node2.next = node1:将 node2 的 next 指向 node1(交换节点 2 和节点 1)。

cur.next = node2:将 cur.next 更新为 node2,完成交换后的连接。

更新 cur:

cur = node1:将 cur 指向 node1,为下一对节点的交换做好准备。

返回结果:

return preHead.next;

返回 preHead.next,它指向链表交换后的新头节点。

执行结果:

结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答...

相关推荐
行走的bug...1 小时前
用图论来解决问题
算法·图论
岁忧2 小时前
(LeetCode 每日一题) 3541. 找到频率最高的元音和辅音 (哈希表)
java·c++·算法·leetcode·go·散列表
pusue_the_sun3 小时前
每日算法题推送
算法·双指针
KyollBM3 小时前
【Luogu】P9809 [SHOI2006] 作业 Homework (根号算法)
算法
jmxwzy3 小时前
leetcode274.H指数
算法
纪元A梦3 小时前
贪心算法应用:信用评分分箱问题详解
java·算法·贪心算法
过河卒_zh15667664 小时前
9.13AI简报丨哈佛医学院开源AI模型,Genspark推出AI浏览器
人工智能·算法·microsoft·aigc·算法备案·生成合成类算法备案
D.....l5 小时前
冒泡排序与选择排序以及单链表与双链表
数据结构·算法·排序算法
欧阳天风5 小时前
链表运用到响应式中
javascript·数据结构·链表