力扣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: ...
随机推荐
- SecureCRT windows 登录 linux
SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件.SecureCRT支持SSH,同时支持Telnet和rlog ...
- Spring 中不得不了解的姿势
说明 本文非原创,我只是进行了整理以及做了一些改动,仅供学习,若需进行商业使用,请联系原作者 原作者:苏三 原文链接:苏三说技术:Spring系列 Spring IOC 本章节解读的流程为Spring ...
- 使用supervisor后台运行celery
一.先安装supervisor 1.安装命令: $ pip install supervisor 如果在沙盒环境下安装不上的话使用: $ apt-get install supervisor 二.安装 ...
- vue入门教程之-插槽
vue入门教程之-插槽 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 https://www ...
- 安装完exe版本jdk之后未配置java_home和path环境变量仍然可以在cmd中使用java命令原因解释
如题: 为何可以 打出Java -version的版本 ,因为jdk安装过程,拷贝了java\javac等几个命令到C:\windows\system32目录了. 如果使用javac -version ...
- Snackbar源码分析
目录介绍 1.最简单创造方法 1.1 Snackbar作用 1.2 最简单的创建 1.3 Snackbar消失的几种方式 2.源码分析 2.1 Snackbar的make方法源码分析 2.2 对Sna ...
- 记录-使用双token实现无感刷新,前后端详细代码
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 近期写的一个项目使用双token实现无感刷新.最后做了一些总结,本文详细介绍了实现流程,前后端详细代码.前端使用了Vue3+Vite ...
- [Git]关联远程库的两种方法及配置
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18000705 出自[进步*于辰的博客] 参考笔记三,P ...
- 使用FlashFXP,密钥方式连接Amazon的CE2实例
操作步骤如下: 1.选择"站点" -> "密钥管理器" 2.选择"导入" 3.名称随意填, 类型选择"用于SFTP的RSA/ ...
- Markdown文档图片展示问题解决方案
微信不支持Markdown排版 目前来看微信公众号是不支持Markdown语法的,所以就会出现Markdown预览,复制在粘贴完成吧. 从资料收集来看有一款出现频率比较高的插件 Markdown ni ...