力扣24(java&python)-两两交换链表中的节点(中等)
题目:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)
示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
解题思路:
递归:题中是两两交换结点,都是重复的步骤就想到了递归。
主要思考三点:
1.返回值是什么?
最终交换完成的子链表
2.具体怎么做?
设两个需要交换的结点一个为head,一个为next,head主要负责连接后面完成交换的链表,next负责连接head。
3.终止条件是什么?
当需要交换的链表为空结点或者无后继结点即head为空指针或者next为空指针时,无法进行交换操作就停止。
举例:head = [1,2,3,4,5,6]
1.首先需要明白这六个数,两两进行分组的(如果是奇数,最后一次递归没有两个结点,就返回最后一个结点就行);

2.(1,2),(3,4),(5,6),head指向下一层的递归函数,next作为头结点,递归到(5,6)时后续没有结点了,就开始交换5和6;


3.然后(3,4)开始交换,3指向交换后的链表,4作为暂时的头结点;

4.最后(1,2)开始交换,1指向后面全部完成交换的链表,2作为最终的头结点。

java代码:
1 /**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11 class Solution {
12 public ListNode swapPairs(ListNode head) {
13 //当结点为空或只有头结点
14 if(head == null || head.next == null) return head;
15 //保存头结点的下一个结点
16 ListNode temp = head.next;
17 //让后续结点递归交换,让头结点进行连接
18 head.next = swapPairs(temp.next);
19 //头结点的下一个结点反向连接头结点
20 temp.next = head;
21 //返回链表
22 return temp;
23
24 }
25 }

pyhthon3代码:
1 # Definition for singly-linked list.
2 # class ListNode:
3 # def __init__(self, val=0, next=None):
4 # self.val = val
5 # self.next = next
6 class Solution:
7 def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
8 if not head or not head.next:
9 return head
10
11 temp = head.next
12 # 使用self参数调用swapPairs()方法
13 head.next = self.swapPairs(temp.next)
14 temp.next = head
15 return temp

2023-05-04:直接模拟
1 //模拟
2 class Solution {
3 public ListNode swapPairs(ListNode head) {
4 if (head == null || head.next == null) return head;
5 ListNode dummyHead = new ListNode(-1);
6 dummyHead.next = head;
7 ListNode cur = dummyHead;
8 //节点个数为奇数或者偶数时
9 while (cur.next != null && cur.next.next != null){
10 //保存当前组的第一个节点,例如1
11 ListNode temp1 = cur.next;
12 //保存下一组的第一个节点,例如3
13 ListNode temp2 = cur.next.next.next;
14 //虚拟头结点指向2
15 cur.next = cur.next.next;
16 //2->1
17 cur.next.next = temp1;
18 //1->3
19 temp1.next = temp2;
20 //移动cur指向下一组的前一个节点,就是节点1
21 cur = temp1;
22 }
23 return dummyHead.next;
24 }
25 }
力扣24(java&python)-两两交换链表中的节点(中等)的更多相关文章
- Java实现 LeetCode 24 两两交换链表中的节点
24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3-&g ...
- NO.24两两交换链表中的节点
NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- 【LeetCode】24.两两交换链表中的节点
24.两两交换链表中的节点 知识点:链表 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 示例 1 ...
- 代码随想录训练营day 5|24.两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题02.07.链表相交 142.环形链表Ⅱ
24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行 ...
- LeetCode 24. 两两交换链表中的节点(Swap Nodes in Pairs)
题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能 ...
- LeetCode-024-两两交换链表中的节点
两两交换链表中的节点 题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例说明请见LeetCode官网. 来源:力 ...
- lintcode-451-两两交换链表中的节点
451-两两交换链表中的节点 给一个链表,两两交换其中的节点,然后返回交换后的链表. 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3. ...
- 【Leetcode链表】两两交换链表中的节点(24)
题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你应该返回 2- ...
- Java实现 LeetCode 237 删除链表中的节点
237. 删除链表中的节点 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 – head = [4,5,1,9],它可以表示为: 示例 1: ...
随机推荐
- 解决 Steam for Linux 部分 Valve 游戏中文显示问题/军团要塞2的字体显示问题
解决 Steam for Linux 部分 Valve 游戏中文显示问题 发表于 Apr 7th 2019 | 分类于 Keep Digging Steam for Linux 上有许多好玩的免费游戏 ...
- linux介绍、安装、shell
1-Linux发展介绍 零 什么是Linux Linux:和我们常见的Windows一样,都是操作系统,但不同的是: Windows: 收费,不开源,主要用于日常办公.游戏.娱乐多一些. Linux: ...
- Redis(5)——亿级数据过滤和布隆过滤器
一.布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求.但是如果我们想知道某一个值是不是已经在 HyperLogLo ...
- C# WinForm 获取执行路径的几种常见方法
//1.获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; Co ...
- OpenCV常量值含义表
色彩空间转换常量 常量值 说明 cv2.COLOR_BGR2GRAY 从 BGR 色彩空间转换到 GRAY 色彩空间 cv2.COLOR_RGB2GRAY 从 RGB 色彩空间转换到 GRAY 色彩空 ...
- KingbaseES V8R6集群运维案例--cluster模式备份sys_backup.sh init故障
KingbaseES V8R6集群运维案例--cluster模式备份sys_backup.sh init故障 案例说明: 通过脚本方式部署KingbaseES V8R6集群后,在'cluster'模式 ...
- Kingbase ES 自定义聚合函数浅析
文章概要: 基于前面的博文<Kingbase ES 自定义聚合函数和一次改写案例>这篇文章,我们只考虑了自定义聚合函数非并行的情况, 因此,本篇文章将着重解析一下使用PLPGSQL编写并行 ...
- https://codeforces.com/gym/496137
AB略. C:想复杂了. 只要判断最大的那个能不能继续吃即可. D:我的做法是建完全图然后跑生成树. 实际上可以这么考虑:和a[1]不同的直接连,相同的就和上一轮和a[1]不同的店去连可以O(n). ...
- MySQL和Oracle里面SQL转换
oracle环境有关sql的注意事项 比较特殊的: 1. 原有 MySQL字段设置为 not null default '' 原因: ORACLE 数据库 不允许存空字符串, 认为它跟null是一样的 ...
- Arm架构下麒麟操作系统安装配置Mariadb数据库
1.安装配置JDK (1)检查机器是否已安装JDK 执行 java -version命令查看机器是否安装JDK,一般麒麟操作系统默认安装openjdk 1.8. (2)安装指定版本JDK 如果麒麟操作 ...