方法一:好理解,但是需要遍历三次链表

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapNodes(ListNode head, int k) {ListNode ahead = new ListNode(0,head);ListNode current = ahead;ListNode topK = new ListNode(0,null);ListNode botK = new ListNode(0,null);int count = 0;//第一次遍历,找到正数第K个节点,然后用一个新的节点暂存信息,同时求得总节点个数while(current.next!=null){count++;current = current.next;if(count==k){topK.val = current.val;topK.next = current.next;}}//count为总节点个数//第二次遍历找到倒数第K个节点,然后用一个新的节点暂存信息//正数是k,倒数换成正数就应该是链表的长度-k+1current = ahead;int increase = 0;while(current.next!=null){increase++;current = current.next;//找到倒数第K个节点,然后用一个新的节点暂存信息if(increase ==(count+1-k)){botK.val = current.val;botK.next = current.next;}}current = ahead;int num = 0;//第三次遍历,交换两个节点while(current.next!=null){num++;current = current.next;if(num==k){current.val= botK.val;//current.next=current.next;//仅仅是交换的节点的val值}if(num==(count+1-k)){current.val=topK.val;//current.next=current.next;}}return ahead.next;}
}

方法二,值遍历一次,但是要注意指针的挪动次数关系的理解

 /**声明三个节点cur、first、last全部指向head节点利用current从头结点开始遍历链表,topK指针移动k - 1步后定位至该链表正数第k个节点,设链表的节点个数为nums,当first指针指向第k个节点时,此时链表还有nums - k个节点没有遍历。因为链表的头节点到倒数第k个节点之间的节点个数刚好也是nums - k个,所以当遍历到正数第k个节点后,botK指针开始从head节点移动nums - k步后即指向了倒数第k个节点。
*/
class Solution {public ListNode swapNodes(ListNode head, int k) {ListNode current = head;ListNode topK = head;ListNode botK = head;int count = 1;while(current.next!=null){           if(count<k){topK = topK.next;}else{botK = botK.next;}count++;current = current.next;}//交换两个节点int temp = topK.val;topK.val = botK.val;botK.val = temp;return head;}
}

LeetCode——1721.交换链表中的节点相关推荐

  1. 【Leetcode -1721.交换链表中的节点 -2058.找出临界点之间的最小和最大距离】

    Leetcode Leetcode -1721.交换链表中的节点 Leetcode -2058.找出临界点之间的最小和最大距离 Leetcode -1721.交换链表中的节点 题目:给你链表的头节点 ...

  2. LeetCode 1721. 交换链表中的节点(快慢指针)

    文章目录 1. 题目 2. 解题 1. 题目 给你链表的头节点 head 和一个整数 k . 交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引). 示例 ...

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

    题目 https://leetcode.com/problems/swapping-nodes-in-a-linked-list/ 题解 思路很简单:找到左节点,找到右节点,最后交换左右节点的 val ...

  4. LeetCode 23合并K个升序链表24两两交换链表中的节点

    维护不易,点赞再看,感谢支持 合并K个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1 ...

  5. Leetcode(24)——两两交换链表中的节点

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

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

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

  7. LeetCode 24:两两交换链表中的节点、1662. 检查两个字符串数组是否相等

    今天一道是单链表一道是String类的 一:LeetCode 24:两两交换链表中的节点 先来看一下题目信息 索引 题目意思就是把一个链表中的两两节点进行交换,题目给的例子是4个节点,是偶数个,两两节 ...

  8. LeetCode 24.两两交换链表中的节点 C语言

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

  9. 24. 两两交换链表中的节点-两两反转链表-LeetCode

    一.题目 二.思路 1.采用递归的方式 2.可以通过递归的方式实现两两交换链表中的节点. 递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换. 如果链表中至少有两个节点,则在两两 ...

最新文章

  1. 形状相似的物品_废弃物品在体育课中的再利用
  2. python求最大连续子数组
  3. Codevs 1689 建造高塔
  4. 浅谈-LINUX 操作系统启动过程
  5. 灵感库 | 让设计师欲罢不能的设计网站
  6. boost.asio无锁异步并发
  7. Matlab计算机视觉/图像处理工具箱推荐
  8. SIP信令协议消息(四)
  9. FusionSphere 物理CPU与VCPU的关系梳理总结
  10. MacBook蓝牙鼠标 自动断开问题
  11. linux 2.6.32文件系统的dentry父子关系
  12. Android微信支付集成流程及其常见错误
  13. 赞美之外,Unity引擎3D引擎存在什么弊病?
  14. 计算机常用英语对话,英语口语对话之买电脑时常用基本口语
  15. 有哪些好用的python在线编程环境?
  16. Android 穿过点画平滑曲线
  17. 不要写死!天猫App的动态化配置中心实践
  18. 买房后为何有装修公司找你?个人信息就卖5毛钱
  19. 数组遍历产生的索引越界问题
  20. 首次揭秘!​春晚活动下快手实时链路保障实践

热门文章

  1. 云场景实践研究第27期:袋鼠云
  2. 多IDC GSLB的部署
  3. 30岁之前需要知道的10个人生底线,你知道几个?
  4. Flex Graphics
  5. 2010年终人生的思考
  6. 路由重分布列表控制例子
  7. mft按钮设计_火力发电厂典型MFT逻辑控制实现.pdf
  8. redis java 遍历key_java遍历读取整个redis数据库实例
  9. scala元组 数组_Scala中的数组
  10. 计算机网络中的传输协议是_计算机网络中的传输方式