当前位置: 首页 > news >正文

【leetcode】链表part2

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

  1. 迭代方法
public static ListNode swapPairs(ListNode head) {// 输入:head = [1,2,3,4]// 输出:[2,1,4,3]ListNode dummy = new ListNode(0);dummy.next = head;ListNode cur = dummy;while (cur.next != null && cur.next.next != null) {ListNode tmp1 = cur.next;ListNode tmp2 = tmp1.next.next;// 交换逻辑cur.next = tmp1.next;tmp1.next.next = tmp1;tmp1.next = tmp2;// 更新指针cur = tmp1;}return dummy.next;
}
  1. 递归方法
public static ListNode swapPairs(ListNode head) {// 递归写法if (head == null || head.next == null) return head;ListNode rest = head.next.next;ListNode newHead = head.next;newHead.next = head;head.next = swapPairs(rest);return newHead;
}

19. 删除链表的倒数第 N 个结点

  • 快慢指针思想
  • 先让fast指针走n步,然后快慢指针同时移动,当快指针为null,则找到倒数第n个节点
public static ListNode removeNthFromEnd(ListNode head, int n) {// 让快指针走n+1步,快慢指针同时移动,当快指针为null,则慢指针为要删除节点的前一个节点(倒数第n+1个节点)ListNode dummy = new ListNode(-1);dummy.next = head;ListNode slow = dummy;ListNode fast = dummy;// 找倒数第n+1个节点for (int i = n+1; i > 0 && fast!=null; i--) {fast = fast.next;}while (fast != null) {slow = slow.next;fast = fast.next;}// 删除倒数第n个节点slow.next = slow.next.next;// 返回头节点return dummy.next;
}

面试题 链表相交

  • 使用快慢指针方法
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {//给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。// 如果两个链表没有交点,返回 null// 设单链表A的长度为a,单链表B的长度为b,设他们公共的长度为c// a+b-c = b+a-c// 即两个链表遍历完自身后,再遍历他们x单位便能找到公共节点ListNode pA = headA;ListNode pB = headB;if (pA == null || pB == null) return null;while (pA != pB) {pA = pA == null ? headB : pA.next;pB = pB == null ? headA : pB.next;}return pA;
}

142. 环形链表 II

  • 当快慢节点相遇后,将快节点移动到链表头部,快节点和慢节点相遇的地方就是入口
public ListNode detectCycle(ListNode head) {ListNode fast = head;ListNode slow = head;// 找到环内某一点while (true) {if (fast == null || fast.next == null) return null;slow = slow.next;fast = fast.next.next;if (slow == fast) {break;}}// 找到入环点fast = head;while (slow != fast) {slow = slow.next;fast = fast.next;}return fast;}
http://www.lryc.cn/news/126467.html

相关文章:

  • C#数据类型转换
  • mybatis-plus逻辑删除的坑
  • SQL Server基础之游标
  • (二)结构型模式:4、组合模式(Composite Pattern)(C++实例)
  • flask接口请求频率限制
  • javaweb监听器和juery技术
  • C++并发多线程--std::unique_lock的使用
  • 【ChatGLM】ChatGLM-6B模型Win+4GB显卡本地部署笔记
  • 青翼科技自研2路250MSPS DA回放FMC子卡模块
  • 硬件产品经理:从入门到精通(新书发布)
  • Opencv-C++笔记 (17) : 模板匹配
  • Maven(四)常用命令大全
  • 13.3 目标检测和边界框
  • TCP/IP网络江湖初探:物理层的奥秘与传承(物理层上篇-基础与本质)
  • 计算机视觉五大核心研究任务全解:分类识别、检测分割、人体分析、三维视觉、视频分析
  • linux -- centos -- cmake 留坑
  • 【100天精通python】Day33:使用python操作数据库_SQLite数据库的使用与实战
  • 通过将信号频谱与噪声频谱进行比较,自动检测适当的带通滤波器转折频率研究(Matlab代码实现)
  • 【Sklearn】基于多层感知器算法的数据分类预测(Excel可直接替换数据)
  • 在 Windows 中恢复数据的 5 种方法
  • 配置使用Gitee账号认证登录Grafana
  • 使用 Flask 部署 Next.js
  • 网络安全--iptables
  • 【猿灰灰赠书活动 - 02期】- 【Java从入门到精通2023年7月最新(第7版)】
  • Springboot 设置统一的请求返回格式
  • logstash日志换行处理小解
  • openpnp - 做一个抛料盒
  • 数据结构——单链表的实现(c语言版)
  • 【计算机组成原理】24王道考研笔记——第四章 指令系统
  • C#使用FileInfo和DirectoryInfo类来执行文件和文件夹操作