【hot100】跟着小王一起刷leetcode -- 24. 两两交换链表中的节点

【hot100】跟着小王一起刷leetcode -- 24. 两两交换链表中的节点

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

题目解读

在这里插入图片描述
简单来说,就是将链表的节点两个划分为一组,例如[1,2]一组,[3,4]一组,然后交换组内节点的顺序即可。

那么怎么交换呢,这里我们要注意几个点

  • 首先,如何交换两个节点
  • 交换结束之后,在后面节点的next需要继承前面节点原来的next

思路

首先,怎么交换两个节点,我们先从图示看下流程
在这里插入图片描述
这里的A,B就是组内的节点,pre是A前面的节点,方便我们进行更换位置时使用,C代表B原来指向的节点

整个流程如下

  • 首先,pre.next更换为指向B。这时候可能有小伙伴说了,更换之后A的引用不就丢失了吗,所以我们要用iter指向A,这样就没有顾忌了。
  • 然后,我们要把A插到B后面,但是有一个问题。上面我们提到,要把A的next改为C,如果直接把A插到B后面,C的引用不就丢失了。因此,我们首先将A.next改为C,然后再把A插到B后面。

这样我们就完成了交换。

但需要注意的是,我们需要更新pre,以方便下一次的交换,因此直接将pre=iter即可。

最后别忘记移动iter到下一组,直接iter=iter.next,因为现在iter指向的A已经是这个组内的第二个节点了。

实现代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode iter = head;
        ListNode tmp = null;
        ListNode pre = new ListNode();
        ListNode start = head;
        while (iter != null && iter.next != null) {
           // 记录一下最终链表的第一个节点
            if (start == head)
                start = head.next;
           // 节点交换  start
            pre.next = iter.next;
            iter.next = pre.next.next;
            pre.next.next = iter;
            // 节点交换  end
            // 更新pre,方便后续的交换
            pre = iter;
            // 移动下标
            iter = iter.next;
        }

        return start;
    }
}

结果

在这里插入图片描述
时间还好,空间还凑乎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不头秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值