题意 给你链表的头节点 head 和一个整数 k 。 交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。 示例 示例 1: ?...k = 1 输出:[1] 示例 4: 输入:head = [1,2], k = 1 输出:[2,1] 示例 5: 输入:head = [1,2,3], k = 2 输出:[1,2,3] 提示 链表中节点的数目是...个节点,第 k 个节点的 next 节点指向倒数第 k 个节点的 next 节点。...就是我把所以的 val 值取出来转数组,在 js 中,单纯的同类型数组,它在内存中是连续的,所以其访问复杂度是 O(1),所以我们把生成的数组的第(k - 1)个 和 数组的长度减去 k 的那位交换。...最后我们构造一个新的链表返回,当然啦,后面笔者比较菜用了两次遍历去构造这个链表然后返回。
题目 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...解题 2.1 递归 class Solution { public: ListNode* swapPairs(ListNode* head) { if(!head || !
两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...p 、 q 为相邻节点 swap()的思想出现在下面函数中, class Solution { public: ListNode* swapPairs(ListNode* head)...q->next = p->next; p->next = q; 本想着用swap(p,q)直接偷懒,最后更新下p、q前一个结点的指向关系就ok,结果输出和输入一毛一样,原本还在纠结,p、q 交换后到底交换了什么...到底是p、q节点的内容变了,位置不变【p、q指向发生了变化】,还是内容不变,p、q位置变了【p、q节点位置发生了变化】,自嘲自己一下,交换指针我还是自己手写交换节点位置吧,交换后p、q的指向再换一下,这个思路还是熟悉的...感受 链表题目的特殊操作,考虑的特例 空表、1、2,为什么要考虑2个节点呢? 比如在节点向后尾插,可能当前操作节点和最后一个节点重叠,出bug。
删除链表中重复节点(递归) public ListNode deleteDuplication(ListNode pHead){ if(pHead == null || pHead.next =
两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...curTmp; pre = curTmp; cur = curTmp.next; } return headNode.next; }; 思路 通过迭代的方式实现两两交换链表中的节点...,直接遍历整个链表即可,首先定义一个空的头结点,之后定义前置节点与当前正需要处理的节点,当正在处理的节点存在以及当前节点的下一个节点都存在时进行循环,将当前节点与当前节点的下一个节点进行缓存,之后将curNode...节点的next赋值为nextNode节点的next,即首先将该节点的下一个节点指向nextNode的下一个节点,之后将preNode的next赋值为nextNode,将nextNode的next赋值为curNode...,最后将preNode赋值为curNode,curNode赋值为curNode的next,注意此时的curNode其实已经被交换换成了,是两个节点中的后一个节点,最后等待循环完成后返回头结点的next即可
题意 给一个链表,两两交换其中的节点,然后返回交换后的链表。 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3。...思路 本题只要循环判断后两个节点不为空的情况下,将后面这两个元素进行交换即可,最重要的是,交换的时候,要记得保留原数据,以便拼接起来链表,谨防数据丢失。...head = n1; } return dummy.next; } } 原题地址 LintCode:两两交换链表中的节点
problem 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...例如: 利用stack 我们利用一个 stack,然后不断迭代链表,每次取出两个节点放入 stack 中,再从 stack 中拿出两个节点。...借助 stack 后进先出的特点,放进去的时候是 1,2 。拿出来的时候就是 2,1 两个节点了。 再把这两个节点串联起来,重复这个逻辑遍历完整个链表,就可以做到两两反转的效果了。...= null) { //将两个节点放入stack中 stack.add(cur); stack.add(cur.next);...//当前节点往前走两步 cur = cur.next.next; //从stack中弹出两个节点,然后用p节点指向新弹出的两个节点
递归解法 大佬解释递归 class Solution { public: ListNode* swapPairs(ListNode* head) { //在递归到最后两个节点的时候...->next == NULL) { return head; } //函数返回的是要交换两个节点的后面一个节点,相当于将交换后的两个节点在放入原链表中...ListNode* newlist = swapPairs(head->next->next); //下面是进行两个节点交换的代码 ListNode*...的节点,此时应该指向p return p; } }; 非递归解法 class Solution { public: ListNode* swapPairs(ListNode...= NULL)//当还剩一个或没有节点的时候,停止交换 { //每一次将temp后面两个节点进行交换操作 ListNode* node1
,两两交换其中相邻的节点,并返回交换后的链表。...你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3....解题思路: 我自己的解题里面大量使用了递归...,能用递归,绝不用循环...所以这里简单说下我的递归版本的思路: 判断当前head节点是否为null或者head.next是不是为null,如果是null,那么就不用翻转了,直接返回head就好了 获取到...最后将next.next指向head,即实现当前两个节点的翻转(此时head.next已经是翻转好的剩余链表了) 简单粗暴.... 我在一开始还想了各种pre, next的定义。
1 题目描述 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。...0 <= Node.val <= 100 4 思路 方法一:递归 可以通过递归的方式实现两两交换链表中的节点。...递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。...如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。...在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。
给一个链表,两两交换其中的节点,然后返回交换后的链表。 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3。...你的算法只能使用常数的额外空间,并且不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...链表处理 链表的插入要正确处理,还要处理奇数个节点和偶数个节点的不同,细节都在注释里了,自己挑个小的链表画一下,主要是一些边界条件弄对就行了。...另外,我自己写链表的时候喜欢用假节点,不爱动链表本身,假节点初始化的时候一定要给一个值。c++不允许使用未初始化的对象。...// write your code here } void Insert(ListNode *last,ListNode *l) //插入,last来记录最后一个节点的位置
微博:@故胤道长[1])的 Swift 算法题题解整理为文字版以方便大家学习与阅读。...如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。 难度水平:中等 1. 描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。...你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 2....示例 1 输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2 输入:head = [] 输出:[] 示例 3 输入:head = [1] 输出:[1] 约束条件: 链表中节点的数目在范围...时间复杂度: O(n) 空间复杂度: O(1) 该算法题解的仓库:LeetCode-Swift[2] 点击前往 LeetCode[3] 练习 特别感谢 Swift社区 编辑部的每一位编辑,感谢大家的辛苦付出
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能使用常数的额外空间。...你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 解:递归,有难度 /** * Definition for singly-linked list.
题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...思路 设置一个dummy 节点简化操作,dummy next 指向head。...初始化first为第一个节点 初始化second为第二个节点 初始化current为dummy first.next = second.next second.next = first current.next...= second current 移动两格 重复 关键点解析 链表这种数据结构的特点和使用 dummyHead简化操作 代码 /* * @lc app=leetcode id=24 lang
题目 给你链表的头节点 head 和一个整数 k 。 交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。 ?...= 1 输出:[1] 示例 4: 输入:head = [1,2], k = 1 输出:[2,1] 示例 5: 输入:head = [1,2,3], k = 2 输出:[1,2,3] 提示: 链表中节点的数目是
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。...如果还不懂 画图就懂了 class Solution { public ListNode swapPairs(ListNode head) { /** 递归做法...可以记住他的解法 */ //1 >2 >3 >4 //如果是奇数 head.next=null 偶数 head=null if
两两交换链表中的节点 - 力扣(LeetCode) 实际上是两个两个一组颠倒顺序,可以用k=2使用【LeetCode热题100】【链表】K 个一组翻转链表-CSDN博客 但可以更简单,就先看两个,先取第二个的指针...,递归颠倒第二个后面的节点,链接到第一个节点上,然后把第一个节点链接到第二个节点上,返回第二个节点指针 class Solution { public: ListNode *swapPairs(
题目大意 交换链表中相邻的两个元素。 注意第一个节点与第二个节点要交换位置,而第二个节点不用与第三个节点交换位置。...注意点: 不允许修改节点的值 只能用常量的额外空间 解题思路 该题费脑,绕来绕去的指向,这个解读比较清晰 来自: https://shenjie1993.gitbooks.io.../leetcode-python/024%20Swap%20Nodes%20in%20Pairs.html 比较常见的链表操作。...下面看一下典型情况,如要交换链表中A->B->C->D中的B和C需要做如下操作: 将A指向C 将B指向D 将C指向B 在头节点之前加一个假节点就可以使所有的交换都符合上面的情况。
两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
这次来写一下 LeetCode 的第 24 题,两两交换链表中的节点。 题目描述 题目直接从 LeetCode 上截图过来,题目如下: ?...上面的题就是 两两交换链表中的节点 题目的截图,同时 LeetCode 给出了一个函数的定义,然后要求实现链表两两交换的函数体。...最初链表的头指向第一个节点,我们首先要交换的是第一个节点和第二个节点,根据指针来看,只要让第一个节点的 next 指向第三个节点,然后让第二个节点的 next 指向第一个节点就可以了。...交换完后的链表成了这个样子,但是仔细观察,不知道是否观察出了问题。我们的 4 号节点没有办法遍历到了。因为 1 号节点的指针仍然指向着 3 号节点,而经过交换,要把 4 号节点放到 3 号节点的前面。...点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们继续修改代码。
领取专属 10元无门槛券
手把手带您无忧上云