Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解
题目描述:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4,你应该返回 2->1->4->3.
注意事项
1、不能简单的交换数值,而是需要更改指针,即确实更改了节点;
2、如果节点个数是奇数,如下图:

那么第5个节点不用交换。只需变成如下图所示链表即可:

但是再考虑节点个数的奇偶,逻辑会比较麻烦;
3、在交换的过程中指针的指向如何更改也是一个问题。
如何交换
以交换3和4为例;

需要进行如下几步操作:
将2节点的next域指向4节点;
将4节点的next域指向3节点;
将3节点的next域指向5节点。
所以可以定义一个交换函数,传进2节点去,记为pre,pre的next域指向的节点(此案例中为3节点)定义为next,
所以分析的步骤即为
//定义一个保存pre.next的节点
ListNode next = pre.next;
//将pre节点的next域指向pre后两个节点
pre.next = next.next;
//prer后一个节点的next域指向pre的后3个节点
next.next = next.next.next;
//在原始状态下时pre的后两个节点的next指向pre的后一个节点
pre.next.next = next;
可以看图分析过程:


判断是否交换并移动pre
//1、判断是否交换
while(pre.next != null && pre.next.next != null){
swap(pre);
//2、指针向后移动两个
pre = pre.next.next;
}
对判断是否交换的一些说明:
如果pre的后一个节点与后两个节点都非空,则进行交换。
完整代码
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre= dummy;
while(pre.next != null && pre.next.next != null){
swap(pre);
pre = pre.next.next;
}
return dummy.next;
}
public void swap(ListNode pre){
ListNode next = pre.next;
pre.next = next.next;
next.next = next.next.next;
pre.next.next = next;
}
}
对代码的一些说明:
1、dummy节点用来表示head的前驱节点,是一个伪节点;
2、最后返回伪节点的next域指向的节点。
欢迎关注
扫下方二维码即可关注:

Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解的更多相关文章
- [Swift]LeetCode24. 两两交换链表中的节点 | Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3 ...
- C#LeetCode刷题之#237-删除链表中的节点(Delete Node in a Linked List)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3832 访问. 请编写一个函数,使其可以删除某个链表中给定的(非末 ...
- C#LeetCode刷题之#203-删除链表中的节点(Remove Linked List Elements)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3826 访问. 删除链表中等于给定值 val 的所有节点. 输入: ...
- Java实现 LeetCode 24 两两交换链表中的节点
24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3-&g ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- 【LeetCode】24.两两交换链表中的节点
24.两两交换链表中的节点 知识点:链表 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 示例 1 ...
- LeetCode 24. 两两交换链表中的节点(Swap Nodes in Pairs)
题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能 ...
- NO.24两两交换链表中的节点
NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...
- LeetCode-024-两两交换链表中的节点
两两交换链表中的节点 题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例说明请见LeetCode官网. 来源:力 ...
- lintcode-451-两两交换链表中的节点
451-两两交换链表中的节点 给一个链表,两两交换其中的节点,然后返回交换后的链表. 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3. ...
随机推荐
- cat命令的一个用法
1: cat 1.txt 2.txt 3.txt > 4.txt 这个操作可以把前三个文件的内容全部复制到第四个文件中去
- regex(python)
正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/26 16:39 # @Author : jackendoff ...
- linux 线程间发送信号
线程间通过 pthread_kill(thid,signo)给指定的thid线程发送signo信号. 创建线程与线程屏蔽字顺序 1. pthread_create(); pthread_sigm ...
- 如何找到我的Python site-packages目录的位置?
来源:广州SEO 我如何找到我的site-packages目录的位置? #1楼 这对我有用: python -m site --user-site #2楼 从“如何安装Django”文档 (尽管这不仅 ...
- fatal: remote origin already exists.
解决方法: 先删除, 再添加 1. git remote rm origin 2. git remote add origin https://github.com/zjulanjian/eshop. ...
- AtCoder Grand Contest 033
为什么ABC那么多?建议Atcoder多出些ARC/AGC,好不容易才轮到AGC…… A 签到.就是以黑点为源点做多元最短路,由于边长是1直接bfs就好了,求最长路径. #include<bit ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
- 数据结构与算法——认识O(NlogN)的排序(1)
归并排序 1) 整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2) 让其整体有序的过程里用了外排序方法 3) 利用master公式来求解时间复杂度 4) 归并排序的实质 时间复杂度0(N ...
- PRaCtice[1]
目录 ID-3学习 代码实现 1. 样例数据集 2.信息熵的计算 ID-3学习 代码实现 该项目采用了业界领先的 TDD(TreeNewBee-Driven Development,吹牛逼导向开发模式 ...
- AttributeError: 'bytes' object has no attribute 'hex'
python3.5之前bytes数据没有hex()属性 需要使用 ''.join(map(lambda x:('' if len(hex(x))>=4 else '/x0')+hex(x)[2: ...