链表中两两交换结点(力扣24)


文章目录


题目

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

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

示例:

输入: 1->2->3->4

输出: 2->1->4->3

注意:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

题解

一、思路

  • 建立虚拟头结点可以不用单独考虑头结点的特殊情况:
java 复制代码
ListNode dummy = new ListNode(-1);
dummy.next = head;
  • 设置两个临时变量存储在交换时会丢失的结点,分别存储下一个结点的前一个和后一个结点

在循环时想清楚终止条件应该为什么:当后面没有结点时,不用再交换位置,在剩一个结点时,也不用交换位置,因为都不满足两个结点的个数不用进行交换,所以终止条件为:
while(cur.next != null&&cur.next.next!=null)

二、解题方法

首先创建虚拟头结点dummy,它的下一个结点指向头结点,按照图中步骤一二三,先指向2,此时结点1、3都由firstNode和secondNode保存,移动cur指针到要交换的元素前一个的位置,这样才能对交换的元素进行操作,循环结束后,记得返回虚拟头结点的下一个结点才是真正的头结点

三、Code

java 复制代码
/**
 * 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 dummy = new ListNode(-1);
        dummy.next = head;
        ListNode cur = dummy;
        ListNode firstNode;
        ListNode secondNode;

        while(cur.next != null&&cur.next.next!=null){
            firstNode = cur.next;
            secondNode = cur.next.next.next;
            cur.next = cur.next.next; //步骤一
            cur.next.next = firstNode;//步骤二
            cur.next.next.next = secondNode;//步骤三
            cur = cur.next.next;
        }
        return dummy.next;
    }
}

总结

这就是对力扣第24题的解题思路和代码实现,需要注意的时如果想对当前元素进行操作,必须要让指针指在前一个元素才能.next操作的了当前元素。希望本文对你理解和解决这道题有所帮助!

相关推荐
狐571 小时前
2026-01-12-LeetCode刷题笔记-1266-访问所有点的最小时间.md
笔记·算法·leetcode
Gorgous—l1 小时前
数据结构算法学习:LeetCode热题100-栈篇(有效的括号、最小栈、字符串解码、每日温度、柱状图中最大的矩形)
数据结构·学习·算法
瑞雨溪1 小时前
力扣题解:740.删除并获得点数
算法·leetcode·职场和发展
Watermelo6171 小时前
探究TOON的价值边界:比JSON更优的大模型友好数据格式?
数据结构·人工智能·语言模型·自然语言处理·数据挖掘·数据分析·json
程序员-King.1 小时前
day125—二分查找—寻找峰值(LeetCode-162)
算法·leetcode·职场和发展
老鼠只爱大米1 小时前
LeetCode算法题详解 3:无重复字符的最长子串
算法·leetcode·面试题·滑动窗口·无重复字符的最长子串·最长子串
星火开发设计2 小时前
C++ multimap 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识
程序员-King.2 小时前
day126—二分查找—寻找旋转排序数组中的最小值(LeetCode-153)
算法·leetcode·二分查找
菜鸟233号2 小时前
力扣494 目标和 java实现
java·数据结构·算法·leetcode
有一个好名字2 小时前
力扣-字符串解码
java·算法·leetcode