题目描述:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 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语言求解的更多相关文章

  1. [Swift]LeetCode24. 两两交换链表中的节点 | Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3 ...

  2. C#LeetCode刷题之#237-删除链表中的节点(Delete Node in a Linked List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3832 访问. 请编写一个函数,使其可以删除某个链表中给定的(非末 ...

  3. C#LeetCode刷题之#203-删除链表中的节点(Remove Linked List Elements)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3826 访问. 删除链表中等于给定值 val 的所有节点. 输入: ...

  4. Java实现 LeetCode 24 两两交换链表中的节点

    24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3-&g ...

  5. leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表

    24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...

  6. 【LeetCode】24.两两交换链表中的节点

    24.两两交换链表中的节点 知识点:链表 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 示例 1 ...

  7. LeetCode 24. 两两交换链表中的节点(Swap Nodes in Pairs)

    题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能 ...

  8. NO.24两两交换链表中的节点

    NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...

  9. LeetCode-024-两两交换链表中的节点

    两两交换链表中的节点 题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例说明请见LeetCode官网. 来源:力 ...

  10. lintcode-451-两两交换链表中的节点

    451-两两交换链表中的节点 给一个链表,两两交换其中的节点,然后返回交换后的链表. 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3. ...

随机推荐

  1. cat命令的一个用法

    1:  cat 1.txt 2.txt 3.txt > 4.txt  这个操作可以把前三个文件的内容全部复制到第四个文件中去

  2. regex(python)

    正则表达式 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/7/26 16:39 # @Author : jackendoff ...

  3. linux 线程间发送信号

    线程间通过 pthread_kill(thid,signo)给指定的thid线程发送signo信号. 创建线程与线程屏蔽字顺序 1. pthread_create();    pthread_sigm ...

  4. 如何找到我的Python site-packages目录的位置?

    来源:广州SEO 我如何找到我的site-packages目录的位置? #1楼 这对我有用: python -m site --user-site #2楼 从“如何安装Django”文档 (尽管这不仅 ...

  5. fatal: remote origin already exists.

    解决方法: 先删除, 再添加 1. git remote rm origin 2. git remote add origin https://github.com/zjulanjian/eshop. ...

  6. AtCoder Grand Contest 033

    为什么ABC那么多?建议Atcoder多出些ARC/AGC,好不容易才轮到AGC…… A 签到.就是以黑点为源点做多元最短路,由于边长是1直接bfs就好了,求最长路径. #include<bit ...

  7. 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信

    题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...

  8. 数据结构与算法——认识O(NlogN)的排序(1)

    归并排序 1) 整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2) 让其整体有序的过程里用了外排序方法 3) 利用master公式来求解时间复杂度 4) 归并排序的实质 时间复杂度0(N ...

  9. PRaCtice[1]

    目录 ID-3学习 代码实现 1. 样例数据集 2.信息熵的计算 ID-3学习 代码实现 该项目采用了业界领先的 TDD(TreeNewBee-Driven Development,吹牛逼导向开发模式 ...

  10. 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: ...