【刷题记录】24. 两两交换链表中的节点

189 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

来源:力扣(LeetCode)

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

示例 1:

image.png

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

示例 2:

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

示例 3:

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

提示:

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

二丶思路分析

通过迭代的方式实现两两交换链表中的节点

  • 创建一个哑哨节点dummyHead 指向 head
  • 初始化一个当前节点 curTempNode 等于 dummyHead
  • 每次交换 curTempNode 后面的两个节点 l1l2
  • curTempNode 后面存在少于两个节点时候,停止。
  • 更新当前节点 curTempNode

三、代码实现

/**
 * 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 dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode curTempNode = dummyHead;

        while (curTempNode.next != null && curTempNode.next.next != null){
             ListNode l1 = curTempNode.next;
             ListNode l2 = curTempNode.next.next;
             
             //交换 l1 l2节点
             curTempNode.next = l2;
             l1.next = l2.next;
             l2.next = l1;
             
             curTempNode = l1;

        }

        return dummyHead.next;

    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 n 是链表的节点数量
  • 空间复杂度:O(1)O(1)

运行结果

image.png

总结

这个题目就是通过迭代或者一个递归,来完成两两节点的交换。

主要还是在对于链表的使用的联系。思路还是很容易理解的。

再接再厉,继续加油~~