leetcode 1721. Swapping Nodes in a Linked List(链表中交换节点)

链表中每两个节点交换位置 LeetCode上的一道两两交换链表节点的题目:如下 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 使用迭代法求解时遇到了一个想了一晚上的问题,记录如下: 首先,官方给出的题解如下: /** ... 阅读详情

在这里插入图片描述
Example 2:

Input: head = [7,9,6,6,7,8,3,0,9,5], k = 5
Output: [7,9,6,6,8,7,3,0,9,5]

给出一个单向链表,交换正向第k个 和 逆向第k个元素。

思路:
由于是单向链表,不能从最后一个节点逆着往回找第k个节点,

所以在正向找到第k个节点以后,用快慢指针,快指针就从第k个出发,慢指针从head出发,
当快指针到达最后一个节点时,慢指针就正好在从结尾开始往回数的第k个节点处。

当然,找第k个节点比较容易,麻烦的是指针交换,
尤其是下面两种情形处理还不一样,用n1表示第k个节点,n2表示倒数第k个节点

case 1: …-> n1 -> node -> … -> node-> n2 -> …
case 2: node -> … -> node -> n1 -> n2 -> … -> node

其中case2如果按case1的办法去交换指针,就会形成环。

既然这么麻烦,那就不交换指针了?题目中说是swapping the values,所以直接交换两个node的值吧。

思路打开,链表节点还是原来的节点,把值交换一下就行了。不要纠结于如何交换指针。

    public ListNode swapNodes(ListNode head, int k) {
        ListNode n1 = head;
        ListNode n2 = head;
        ListNode fast = head;
        
        for(int i = 1; i < k; i++) {
            fast = fast.next;
        }
        
        n2 = fast;
        
        while(fast.next != null) {
            fast = fast.next;
            n1 = n1.next;
        }
        
        //swap value
        int tmp = n1.val;
        n1.val = n2.val;
        n2.val = tmp;
        
        return head;
    }

版本2,不用快慢指针,直接3个指针一起走。

public ListNode swapNodes(ListNode head, int k) {
    ListNode cur = head;
    ListNode kth = head;
    ListNode lastKth = head;
    int cnt = 1;

    while(cur.next != null) {
        cur = cur.next;
        if(cnt < k) kth = kth.next;
        if(cnt >= k) lastKth = lastKth.next;
        cnt ++;
    }

    int tmp = kth.val;
    kth.val = lastKth.val;
    lastKth.val = tmp;

    return head;
}
广工计组实验f2一位全加器 一位全加器实验 阅读详情

相关推荐

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

Leetcode 1721. Swapping Nodes in a Linked List

题目 解析 这个题目有如下的几个问题需要解决: 如何在遍历链表时找到两个需要被交换的节点位置 从头开始的第k个节点很好找,从结尾开始的第k个节点比较难找。比较笨的办法是先遍历一边列表,拿到长度,根据长度确定后面那个的位置。比较聪明的办法在下面解法会讲到 找到后如何交换 交换的话就会需要定位到两个节点分别的前后节点,实际上只需要两个节点的前面节点,后面可以通过next得到 如何处理特殊情况 有三种特殊情况需要处理 解法1:交换值 首先这边讲下比较聪明的定位从结尾开始的第k个节点。第一种方法:先便利找到顺

qq_37821701的博客 425

【时间序列预测算法】——Holt-Winters算法介绍及代码实现

背景 一阶二阶三阶指数平滑方法拟合效果均较好,通过结合数据自然属性,数据自身、趋势变化、季节性,提出了这三个角度的衡量量,可以说,理解起来更自然、更亲切。 公式 一阶: sts_tst​是t时刻对xtx_txt​的估计值,这里只有一个参数α,是数据本身的平滑属性的体现。 二阶: 引入了时间趋势变量btb_tbt​,优化了一下一阶的公式。同时还可以预测t+m时刻的值: 三阶: 又引入了季节性周期描述变量ctc_tct​,优化了一下二阶的公式。同时还可以预测t+m时刻的值: NOTE:ct

BlackValley的博客 1万+

【Leetcode】1721. Swapping Nodes in a Linked List

题目地址: https://leetcode.com/problems/swapping-nodes-in-a-linked-list/ 给定一个链表,和一个正整数kkk,要求将该链表的正数第kkk个和倒数第kkk个链表节点交换。kkk从111开始计数。 代码如下: public class Solution { public ListNode swapNodes(ListNode head, int k) { ListNode n1 = head, n2 = head, fast

数学、算法爱好者的博客 298

2D激光slam数据集的下载与测试

参考博客: https://blog.csdn.net/qq_24894159/article/details/81265991 https://blog.csdn.net/fk1174/article/details/52673413#commentBox 数据集下载与生成 下载数据集 下载网址: http://ais.informatik.uni-freiburg.de/slamevaluation/datasets.php 进去网站后点你想下载的对应的"download log file" 然后你

老李的博客 4024

恶意代码实验3:Word宏病毒实验

只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。回答不正确三次,即可自动跳出病毒程序,但那时已经出现几十个文档。1、打开的宏编辑器如图所示,即可编写病毒代码。

qq_63949327的博客 6504

1721. Swapping Nodes in a Linked List

题目: You are given theheadof a linked list, and an integerk. Returnthe head of the linked list afterswappingthe values of thekthnode from the beginning and thekthnode from the end (the list is1-indexed). Example 1: Input: head = [1,2,3,...

weixin_49991368的博客 412

【产品】 产品设计:如何解决铝合金氧化着色后表面硬度低的问题(硬质氧化)

1、氧化处理技术 1)化学氧化 化学氧化处理所获得的膜层较薄,一般厚度为0.5μm ~4μm,质软不耐磨,抗蚀能力低于阳极氧化膜。 一般不宜单独便用,由于化学氧化膜吸附能力好,主要作用于油漆的底层,化学氧化按其溶液性可分为碱性和酸性两种。按其膜层性质可分为氧化膜,磷酸盐膜、铬酸盐膜及磷酸一铬酸盐膜等(这类型的氧化膜是可导电)。 2)电化学氧化(阳极氧化) 电化学氧化(俗称阳极氧化)是铝及...

产品线负责人 9723

C语言与C++的格式化输入与输出

头文件#include<stdio.h> 输出printf输入scanf注意事项如下。 #define _CRT_SECURE_NO_WARNINGS //空格!!!!! #include<stdio.h> int main() { int n,m; scanf("%d", &n); //加引号,加& ,不要在%和d中间加空格!!!! m = (n % 10) * 100 + (n / 10 % 10) * 10 + (n / 1.

qq_51015727的博客 1549

SerDes电路的PCB仿真设计规则及策略

SerDes的PCB设计中,重点工作是使用3D 电磁 (EM) 场求解器,进行过孔结构优化,包括 BGA的扇入和扇出区域以及布线的过孔区域,并且,利用连接器供应商提供加密的 3D 模型,进行连接器和 PCB 的级联仿真,最终获取系统级的通道性能参数,如插入损耗、回波损耗、串扰和模式转换、阻抗曲线等,如果发现任何缺陷,再进行进一步优化,这一过程中,推荐进行拆分仿真,以提高设计效率。

一只豌豆象的博客 2190

PC 端微信页面拆分及 JavaFx 使用

一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...

bugstack虫洞栈 3606

[leetcode] Swap Nodes in Pairs

/**   思路是 使用pre保存 上一个节点,cur保存当前正在处理的节点,next表示要交换的下一个节点,tmp保存这一组交换完成后,下一组要交换的开始节点。 **/ public class Solution {     public ListNode swapPairs(ListNode head) {         if(head==null||head.next==null

liang0000zai的专栏 599

ESP32网络开发实例-开发环境搭建

NodeMCU-ESP-32S开发环境搭建 NodeMCU-32S 最强的ESP32 开发板非盗版或副厂的CH340。WiFi 蓝牙ESP-32 可用Arduino IDE ESP32-S 是一款通用型WiFi-BT-BLE MCU模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和MP3解码等。 此款模组的核心是ESP32芯片,具有可扩展、自适应的特点。两个CPU核可以被单独控制或上电。时钟频率的调节范围为80 MHz到240 MHz。用户可以切断CPU的电源,利用低

视觉与物联智能 3781

leetcode 1721. Swapping Nodes in a Linked List | 1721. 交换链表中的节点(Java)

题目 https://leetcode.com/problems/swapping-nodes-in-a-linked-list/ 题解 思路很简单:找到左节点,找到右节点,最后交换左右节点的 value 即可。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int

寒泉 4万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode 1721 Swapping Nodes in a Linked List 每日一题 20210315

1721 Swapping Nodes in a Linked List You are given the head of a linked list, and an integer k. Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node from the end (the list is 1-indexed). Example 1

cyberickk blog 171

leetcode 1721. Swapping Nodes in a Linked List(python)

根据题意,就是给出了一个链表,并且给出了一个数字,要求我们用将链表的正向第 k 个值和逆向的第 k 个值进行交换,最后返回新的链表的头节点 head。原题链接:https://leetcode.com/problems/swapping-nodes-in-a-linked-list/您的支持是我最大的动力。

王大呀呀的博客 499

leetcode 耗时100 1721. Swapping Nodes in a Linked List

Problem:计算长度的,然后拿到两个node的pre, now, next,若n - k < k -1则令k = n- k + 1特殊情况是k= 1,和now2 == next1交换两者的数值就可以了。

邹九的个人博客 176

LeetCode 1721 Swapping Nodes in a Linked List (链表 快慢指针)

You are given theheadof a linked list, and an integerk. Returnthe head of the linked list afterswappingthe values of thekthnode from the beginning and thekthnode from the end (the list is1-indexed). Example 1: Input: head = [1,2,3,4,5], k ...

Tc的专栏 550

Leetcode 1721. Swapping Nodes in a Linked List [Python]

笨办法,设置一个valuelist,记录全部的值和正数、倒数第K个值,然后做好记录;设置新的头节点,其next节点指向head。同时设置counter记录走了多少步了,当步数与k一样时,换值为倒数k的值,当步数与倒数K值的正数index数字一样时,换值为K位置的值。 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = va

sinat_30403031的博客 402

Leetcode——Swapping Nodes in a Linked List

文章目录题目描述测试样例思路分析具体实现事故现场 题目描述 You are given the head of a linked list, and an integer k. Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node from the end (the list is 1-indexed). 现给出一个链表的头结

Blackoutdragon的博客 414

Swapping Nodes in a Linked List

You are given theheadof a linked list, and an integerk. Returnthe head of the linked list afterswappingthe values of thekthnode from the beginning and thekthnode from the end (the list is1-indexed). Example 1: Input: head = [1,2,3,4,5], k ...

leetcode 解题思路 542

Swapping Nodes in a Linked List(C++交换链表中的节点)

Swapping Nodes in a Linked List(C++交换链表中的节点)

coolsunxu的博客 184

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

1. 虚拟头节点 在反转列表一文中就有用到虚拟头节点(reverseHead),只不过是在定义链表的时候直接用的,目的就是用一个不含任何有效数据的head来方便我们对链表进行操作。唯一需要注意的是最后return的是虚拟头节点的下一个节点。 2.两两交换链表中的节点 题目:https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 解

jsdoulaoula的博客 427

511.Swap Two Nodes in Linked List-交换链表当中两个节点(中等题)

交换链表当中两个节点 题目给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。注意事项 你需要交换两个节点而不是改变节点的权值 样例给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4 返回结果 1->4->3->2->null。 题解基本的链表题,需注意两个节点相邻的问题

三色旗飞扬 566

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352
上一篇: leetcode 680. Valid Palindrome II(有效的回文字符串II)
下一篇: SOLD2算法详解之2: 特征点检测,点NMS(CVPR 2021)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值