首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

leetcode 24成对交换节点。一个意想不到的错误!(ListNode中的错误发现循环)使用Java语言

leetcode 24成对交换节点是一道经典的链表问题,要求将给定链表中的每两个相邻节点进行交换,并返回交换后的链表头节点。

在解决这个问题时,我们可以使用递归或迭代的方法来实现。下面是使用Java语言的解法示例:

代码语言:txt
复制
public class Solution {
    public ListNode swapPairs(ListNode head) {
        // 判断链表为空或只有一个节点的情况
        if (head == null || head.next == null) {
            return head;
        }
        
        // 创建一个虚拟头节点,方便处理头节点的交换
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        
        // 定义两个指针,分别指向当前要交换的两个节点的前一个节点和后一个节点
        ListNode prev = dummy;
        ListNode curr = head;
        
        while (curr != null && curr.next != null) {
            // 获取要交换的两个节点
            ListNode first = curr;
            ListNode second = curr.next;
            
            // 交换节点
            prev.next = second;
            first.next = second.next;
            second.next = first;
            
            // 更新指针位置
            prev = first;
            curr = first.next;
        }
        
        return dummy.next;
    }
}

这个解法使用了迭代的方法,通过定义两个指针来交换相邻节点。首先判断链表是否为空或只有一个节点,如果是,则直接返回原链表。然后创建一个虚拟头节点,将其指向原链表的头节点。接着定义两个指针prev和curr,分别指向当前要交换的两个节点的前一个节点和后一个节点。在循环中,通过交换节点的指针来实现节点的交换,并更新指针位置。最后返回虚拟头节点的下一个节点作为交换后的链表头节点。

这个问题的应用场景是在链表操作中,需要对相邻节点进行交换的情况。例如,在链表中进行排序或其他操作时,可能需要将相邻节点进行交换以满足特定的要求。

推荐的腾讯云相关产品是云服务器(CVM)和云数据库MySQL(CDB)。云服务器提供了弹性的计算资源,可以满足各种规模的应用需求。云数据库MySQL是一种高性能、可扩展的关系型数据库服务,适用于各种应用场景。您可以通过以下链接了解更多关于腾讯云的产品和服务:

希望以上信息对您有帮助!如果还有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

LeetCode-24 两两交换链表中的节点

两两交换链表中的节点 > 难度:中等 > 分类:链表 > 解决方案:节点的交换 今天我们学习第24题两两交换链表中的节点,这是一道中等题。...题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...分析 这个题为基础的链表节点操作题,是将链表的节点两两进行交换,而且必须是交换节点而不能仅仅只改变链表的值。像这样的题,需要画一个图,来弄清楚指针的位置。...Github地址 LeetCode-24 两两交换链表中的节点:https://github.com/JacobLei/leetcode/blob/master/src/main/java/A24_SwapNodesinPairs.java...参考链接 两两交换链表中的节点:https://leetcode-cn.com/problems/swap-nodes-in-pairs/

43220
  • LeetCode - 两两交换链表中的节点

    该题是第24题,这题一开始我还想了好一会儿,后来发现,好像这样子就好了。递归真的是能用就用,实在是因为递归写起来简单啊。...给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。...你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3....,能用递归,绝不用循环...所以这里简单说下我的递归版本的思路: 判断当前head节点是否为null或者head.next是不是为null,如果是null,那么就不用翻转了,直接返回head就好了 获取到...head.next节点,然后将当前head节点的next指向head.next.next节点的翻转结果。

    50320

    LeetCode | 24.两两交换链表中的节点

    这次来写一下 LeetCode 的第 24 题,两两交换链表中的节点。 题目描述 题目直接从 LeetCode 上截图过来,题目如下: ?...上面的题就是 两两交换链表中的节点 题目的截图,同时 LeetCode 给出了一个函数的定义,然后要求实现链表两两交换的函数体。...最初链表的头指向第一个节点,我们首先要交换的是第一个节点和第二个节点,根据指针来看,只要让第一个节点的 next 指向第三个节点,然后让第二个节点的 next 指向第一个节点就可以了。...有了这些指针,就可以完成我们的交换了,如下图: ? 当交换完成以后,就接着移动这三个指针,进行下一次的交换。这样就构成了一个循环,怎么来判断是否循环?...让 new = head,当 new 为 NULL 或者 new->next 为 NULL 的时候,就说明没有节点或者只剩一个节点了,就不用再交换了,这样循环就结束了。

    45930

    算法刷题笔记02:Linked List

    head.next = None return res 24.两两交换链表中的节点 题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。...你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...# 1是不能指向2的next,1应该指向4,而循环迭代的时候一次处理2个节点 # 1和2的关系弄清楚了,3和4的关系也能弄清楚,但需要一个指针来处理 #...参考链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/solution/dong-hua-yan-shi-24-liang-liang-jiao-huan-lian-bia...,我们只需要交换前两个链表即可, # 这里我们把链表分为3组,分别是第1个节点,第2个节点,后面 # 的所有节点,也就是1→2→3,我们要把它变为2→1→3

    19110

    LeetCode链表知识点&题型总结

    坚持一两个月,你会发现你的感觉逐渐好起来了 废话不多说了,开始进入今天的正文,LeetCode链表知识点&题型总结 知识点 什么是链表 ​ 链表(Linked List)是一种常见的线性结构。...循环链表 ​ 循环链表是一种特殊的单链表,与单链表不同的是尾节点不指向空地址,指向链表的头结点。优点是从链尾到链头比较方便,当要处理的数据具有环形结构特点是,非常适合用循环链表来处理。...双向链表 ​ 双向链表支持两个方向,每个节点不只有一个后驱指针next指向后面的节点,还有一个前驱指针prev指向前面的节点。 ? 双向循环链表 ?...如果需要交换两个节点的位置,譬如24题 Swap Nodes in Pairs,需要交换两个相邻位置的节点,对于这两个前驱节点,他们的next指针会受到影响,这两个节点本身也会受到影响,可以用以下步骤:...1)先交换两个前驱节点的next指针的值 2)再交换这两个节点的next指针的值 无论这两个节点的相对位置和绝对位置如何,以上的处理方式均可成立 4.同时操作两个链表的处理。

    1.6K10

    单链表相关习题(超详细!)(1)

    3.代替新节点进行循环,我们在进入循环的时候需要【】判断新节点是否为空,如果为空直接把原链表的头结点给予新节点就好,循环结束以后,我们就可以得到一个没有指定数据的单链表,下面小编开始通过图文的方式进行分别解释了...先来看原链表的第一个结点的数据,不是指定数据,可以进行复制: 之后我们通过循环从下一个结点开始看,也不是指定数据,可以复制: 在看下一个结点,发现是指定数据,这里直接不复制了: 经过一系列的循环以后...,我们便可以得到一个船新的单链表: 所以由此可以看出,循环结束的方式就是pour不能为空,为空循环结束,可能有一些读者朋友已经迫不及待的去直接返回新节点的头了,那可就大错特错了,我们在刚进入循环的时候...,继续比较,不难看出第二个链表的结点的数据要小于第一个链表结点的数据,所以我们把第二个链表的结点接给新节点: 经过一系列的交换以后,head1已经到了NULL,此时我们需要停止循环: 之后我们将先结点的下一个数据直接指向剩余的那个链表剩余的结点就好...,小编这是第二次讲述这种算法题了,可能有一些不太=完善,恳请大家见谅,如果有错误可以在评论区指出,小编一定及时的答复,其实小编本来想讲述寻找中间节点的题目的,不过小编发现它与其他我想讲的题目有着很大的共同点

    11710

    【算法学习】:搞懂链表题型,这一篇就够了

    实战技巧 画图分析:在纸上画出链表结构和指针变化,避免逻辑错误( 链表中 画图 是非常重要的) 边界检查:处理头节点、尾节点、空链表等情况 断链保护:修改指针前记录后续节点,防止丢失链表 ListNode...->next) 循环引用导致死循环 在遍历链表时记录已访问节点(如使用哈希表检测环) 双向链表未同步更新前后指针 插入或删除节点时,同时修改前驱和后继节点的指针 6....为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。...因此,当发现slow与fast相遇时,我们再额外使用一个指针ptr。起始,它指向链表头部;随后,它和slow每次向后移动一个位置。最终,它们会在入环点相遇。...两两交换链表中的节点 具体题目:24. 两两交换链表中的节点 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。

    8910

    LeetCode - #25 K 个一组翻转链表

    LeetCode 算法到目前我们已经更新了 24 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。...如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。 难度水平:困难 1. 描述 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。...k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 进阶: 你可以设计一个只使用常数额外空间的算法来解决此问题吗?...你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 2....} return dummy.next } } 主要思想:在一个循环中反转一组。 从后往前构造一个反向组。

    13320

    递归相关练习

    合并两个有序链表 - 力扣(LeetCode) 重复子问题:将l1的头节点跟l2的头结点比较 得到一个较小的头节点l1 随后继续比较 将l1后面一个节点跟l2第一个节点比较 又得到一个较小的节点 不断下去...反转链表 - 力扣(LeetCode) 解题思路 :不进行处理,先让head走到最后一个节点,如果有head为空或者下一个节点为空的话,直接返回最后一个节点 并做个新节点的头 紧接着回退 并且重复每个一样的子过程...让当前节点后面节点指向自己 并且自己指向空 24....两两交换链表中的节点 - 力扣(LeetCode) 思路:两两交换 先遍历到最后一个节点 递归出口:看看最后一个节点或下一个节点是否为空 就回退 子问题: 1->2 3->4 解决思路一样 函数头设计...Pow(x, n) - 力扣(LeetCode) 解题思路:当求一个数的次方时,用循环遍历的方式必然效率是低下的 如图 :当求2^12时候 我们可以先求2^6 当求2^6时候 我们可以求2^3

    7710

    【Leetcode -19.删除链表的倒数第N个结点 -24.两两交换链表中的节点】

    Leetcode -19.删除链表的倒数第N个结点 题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。...,创建一个哨兵位,使用快慢指针,快指针从head开始走,慢指针从哨兵位开始走,快指针先走n步,加上哨兵位,和慢指针拉开n+1步,这样才可以使要删除的结点的上一个结点直接指向要删除的结点的下一个结点,即删除倒数第...struct ListNode* curr = p->next; free(p); return curr; } Leetcode - 24.两两交换链表中的节点...题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。...,在交换两个节点前设定一个节点curr,每次curr后面的两个节点交换; 初始定义: 第一次交换: 更新curr: 上图之后再次进入循环,node1和node2继续迭代: 后面的图省略,代码如下

    9610

    【算法】213-每周一练 之 数据结构与算法(LinkedList)

    四、判断链表是否有环 设计一个函数 hasCycle,接收一个链表作为参数,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。...给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。...解题思路1.使用迭代: 和反转链表类似,关键在于有三个指针,分别指向前后和当前节点,而不同在于两两交换后,移动节点的步长为2,需要注意。...解题思路2.使用递归: 这里也可以使用递归,也可以参考反转链表的问题,终止条件是递归到链表为空,或者只剩下一个元素没得交换了,才终止。 ---- 解析: 题目出自:[Leetcode 24....两两交换链表中的节点] (https://leetcode-cn.com/problems/swap-nodes-in-pairs/) 介绍两种常用方法: 1.使用迭代: /** * Definition

    63530

    链表合并与节点交换——LeetCode 第 23&24 题

    今天的两道题目全都围绕链表,第一个是困难级别的、要合并多个排序的链表;第二题是中等难度,需要两两交换链表中的节点,昨天没能用递归法写出代码,今天就尝试用递归实现了下,测试效果不咋地,但递归法跑通了!...,由于合并两个链表的函数结果是一个链表,那么就可以使用上面这种 合并(合并(一半),合并(另一半)) 的巧妙思路,调用次数瞬间降到了 log2(n)。...题目二 第 24 题:两两交换链表中的节点: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...但此外的交换节点过程基本都是相似的,但要注意的是,n 和 n.next 交换后,n 所在的新节点指向下一单元,而下一单元也会经历类似的交换。...所以这里我们也可以在进行 swap(n) 时,在其中继续调用 swap(n.next.next) 对下一单元进行交换,这样最终会先完成对下一单元的交换,再来进行对 n 的交换。

    36720

    字节面试题,最优解通过!

    一、题目描述 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...1、寻找出原链表的中点,把链表划分为两个区域 2、将右边的链表进行反转 3、把这两个区域进行交错合并 1、使用快慢指针寻找链表中点 在链表的头节点设置两个指针 slow、fast,同时将它们向后移动。...// 右边区域为 6 -> 7 -> 8 // 但在视频讲解中,我把 5 归为了右边区域,这是一个错误 // 虽然这个错误并不影响结果,因为合并过程都是一样的逻辑.../ LeetCode 876 : 链表的中间节点 public ListNode middleNode(ListNode head) { ListNode fast = head...; // head 原来的下一节点指向自己,所以 head 自己本身就不能再指向原来的下一节点了 // 否则会发生无限循环 head.next = null

    50940

    每天一算:Swap Nodes in Pairs

    LeetCode上第24号问题:Swap Nodes in Pairs 题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。...说明: 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 解题思路 该题属于基本的链表操作题。...设置一个虚拟头结点dummyHead 设置需要交换的两个节点分别为node1、node2,同时设置node2的下一个节点next 在这一轮操作中 将node2节点的next设置为node1节点 将node1...节点的next设置为next节点 将dummyHead节点的next设置为node2 结束本轮操作 接下来的每轮操作都按照上述进行。...我们会在每天早上8点30分准时推送一条LeetCode上的算法题目,并给出该题目的动画解析以及参考答案,每篇文章阅读时长为五分钟左右。

    47030

    【面试高频系列】既能考察对「数据结构」的掌握,还能考察对「递归函数」的设计 ...

    题目描述 这是 LeetCode 上的「24. 两两交换链表中的节点」,难度为 Medium。 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。...你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: ?...链表和树的题目天然适合使用递归来做。...我们可以设计一个递归函数,接受一个 ListNode 节点 root 作为参数,函数的作用是将 root 后面的两个节点进行交换,交换完成后再将下一个节点传入 ......复杂度为 空间复杂度: 最后 这是我们「刷穿 LeetCode」系列文章的第 No.24 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题

    34520

    链表调试示例 -24.两两交换链表中的节点(中等)

    24....两两交换链表中的节点(中等) 题目链接 https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 解题思路 定义一个虚拟的头结点, 辅助遍历 判断当前结点的...from leetcode.linked_struct import ListNode from leetcode.linked_struct import SingleLinkList link_list...step 2 上面是经历过一次while循环后的变量信息打印.由左边框的部分可见, 一轮循环后, value=1 和 value=2 的前2个结点已经交换完毕了 同时可以用id(dummy), id(...head)这种方式查看某一个结点的地址信息(以后做链表题可能会用到) step 3 这是直接运行的结果, 操作是: 先打印一下原始链表 调一次交换结点的方法 打印一下当前的链表 结果可以显示 操作前

    28610
    领券