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

36 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

链表中节点的数目在范围 [0, 100]0 <= Node.val <= 100

解题思路

本题一看就是考察的链表,需要将两两节点交换位置。因为交换了位置后第二个节点就是头节点所以我们需要

  1. 先创一个空节点,空节点的next节点指向head节点。 image.png
  2. 现在的第二个节点就是之前的第一个节点了,然后我们将值为1的节点的next节点指向值为3节点, image.png
  3. 将值为2的节点的next指向值为1的节点, image.png 注意这两部的顺序不能反,否则就会出现死循环了。 image.png 4.将ans节点的next节点指向值为2的节点 image.png 然后依次类推。注意刚开始的时候要判断head是否为空,否则head.next就会报错

代码

class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null) return head;
        ListNode ans = new ListNode(0,head);
        ListNode curr = ans;
        ListNode next = curr.next;
        ListNode next2 = next.next;
        while (next != null && next2 != null) {
            ListNode next3 = next2.next;
            next.next = next3;
            next2.next = next;
            curr.next = next2;
            curr = next;
            next = next3;
            if (next != null) {
                next2 = next.next;
            }
        }
        return ans.next;
    }
}

image.png

总结

就是链表就换两个节点的升级版,需要理清思路,可以在本子上画一画,注意不要造成死循环和一些空值的判断,因为空值的next就没有数据了,会报错的。