K个一组翻转链表(025)

先看代码

class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(-1, head);
ListNode prev = dummy;
while(prev.next != null){
ListNode curr = reverse(prev, k);
if (curr == null){
reverse(prev, k);
break;
}
prev = curr;
} return dummy.next;
} private ListNode reverse(ListNode prev, int k){
ListNode curr = prev.next;
int i = 1;
for (;i < k && curr.next != null; i++){
ListNode next = curr.next;
curr.next = next.next;
next.next = prev.next;
prev.next = next;
}
return i < k ? null : curr;
}
}
  • 分析

重点在 reverse 部分

全局上prev 不动一直指向k个一组的起始部分, curr移动到k个一组末尾

单次中prev指向curr 指向的后一个节点, curr 向后移动

随机链表的复制(138)

先看代码

class Solution {
public Node copyRandomList(Node head) {
if (head == null){
return null;
}
Map<Node, Node> map = new HashMap<>();
Node curr = head;
while (curr != null){
map.put(curr, new Node(curr.val));
curr = curr.next;
} curr = head;
while (curr != null){
map.get(curr).next = map.get(curr.next);
map.get(curr).random = map.get(curr.random);
curr = curr.next;
} return map.get(head);
}
}
  • 分析

题目的要求是要<深拷贝>一组链表(要求各节点地址不同)

难点在于以node.next为方向node.random 可能会指向未初始化节点

所以我们要先一步初始化复制的链表, 再在之后的遍历中把新node进一步拷贝

如何最高效的进一步拷贝node呢, 有O(1)的复杂度就好了, 是什么呢, 好难猜啊

排序链表(148)

先看代码

class Solution {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null){
return head;
}
ListNode fast = head.next, slow = head;
while (fast.next != null){
fast = fast.next;
slow = slow.next;
if (fast.next != null){
fast = fast.next;
}
}
ListNode temp = slow.next;
slow.next = null; ListNode lef = sortList(head);
ListNode rig = sortList(temp); ListNode dummy = new ListNode(-1);
ListNode res = dummy;
while (lef != null && rig != null){
if (lef.val < rig.val){
dummy.next = lef;
lef = lef.next;
}else{
dummy.next = rig;
rig = rig.next;
}
dummy = dummy.next;
} dummy.next = lef!=null ? lef : rig;
return res.next;
}
}
  • 分析

根排序数组一样, 二分→排序→合并

  • 踩坑

快慢指针在面对长度为2的链表, 没有快慢区分度 需要ListNode fast = head.next 让快指针先走一步

合并K个升序链表(023)

先看代码

class Solution {

    public ListNode mergeKLists(ListNode[] lists) {
return mergeKLists(lists, 0, lists.length);
} private ListNode mergeKLists(ListNode[] lists, int i, int j){
int m = j - i;
if (m == 0) return null;
if (m == 1) return lists[i]; ListNode lef = mergeKLists(lists, i, i + m/2);
ListNode rig = mergeKLists(lists, i + m/2, j);
return mergeTwoList(lef, rig);
}
private ListNode mergeTwoList() //实现同合并两个有序链表
  • 分析

同样, 先对k个链表进行 K分→二分→排序→合并→K合

LRU缓存(146)

先看代码

    代码有点长 ,就不看了就看个总体吧

    private static class Node {
int key, val;
Node prev, next; Node (int k, int v){
key = k;
val = v;
}
}
private final int capacity;
private final Node dummy = new Node(0,0);
private final Map<Integer, Node> keyToNode = new HashMap<>();
  • 分析

通过 HashMap保证O(1)的增删改查 链表来排序节点的新旧

利用prev, next 形成以dummy 为介质的环形链表

hot100之链表下的更多相关文章

  1. Chapter07 链表(下):如何轻松学出正确的链表代码?

    技巧一:理解指针或引用的含义 技巧二:指针丢失和内存泄漏 技巧三:利用哨兵简化实现难度 技巧四:重点留意边界条件处理 如果链表未空时,代码是否能够正常运行 如果链表只包含一个节点时,代码能否正常运行 ...

  2. linux下bus、devices和platform的基础模型

    转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核 ...

  3. c++链表归并排序的迭代版本

    之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...

  4. linux下i2c驱动笔记 转

    1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...

  5. java实现链表结构

    1. 定义节点node public class Node<T> { private Node<T> pre; private Node<T> next; priv ...

  6. Java学习笔记--链表

    心在山东身在吴,飘蓬江海漫嗟吁. 他时若遂凌云志, 敢笑黄巢不丈夫. --水浒传 先上源代码,LinkedList类: private static class Node<E> { E i ...

  7. 用js来实现那些数据结构07(链表01-链表的实现)

    前面讲解了数组,栈和队列.其实大家回想一下.它们有很多相似的地方.甚至栈和队列这两种数据结构在js中的实现方式也都是基于数组.无论增删的方式.遵循的原则如何,它们都是有序集合的列表.在js中,我们新建 ...

  8. c语言——单链表分拆——头插法创建链表,尾插法生成链表

    #if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...

  9. C和C指针小记(十七)-使用结构和指针-链表

    1.链表 链表(linked list)即使是一些包含数据的独立数据结构的(Node)集合. 链表中的每个节点通过链或指针链接在一起. 程序通过指针访问链表中的节点. 节点通常是动态分配的,但也有由节 ...

  10. 剑指Offer——从尾到头打印链表

    题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 分析: 方法1:利用栈的性质,先从头到尾遍历链表每个节点的值存入栈中,最后一个一个出栈顺序便是从尾到头的. 方法2:直接从头到尾遍历链表存储节 ...

随机推荐

  1. List集合分页处理的方法

    参考https://www.cnblogs.com/cmz-32000/p/12186362.html 解决了数组越界问题 参数页码大于总页码时返回null(可根据自己业务调整为返回最后一页数据) s ...

  2. [源码系列:手写spring] IOC第一节:简单bean容器

    本专栏带领大家手写一遍spring的核心代码,包括IOC,AOP,三级缓存... 第一节较为简单,后面的章节会逐渐提升代码量和复杂度,喜欢的同学记得订阅哦  ̄▽ ̄ 定义一个简单的bean容器BeanF ...

  3. Text Bg ContentSizeFitter的另类控制

    using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; [RequireComponent(typeof(Co ...

  4. Spring框架中的单例bean是线程安全的吗?

    1.介绍两个概念 有状态的bean:对象中有实例变量(成员变量),可以保存数据,是非线程安全的 无状态的bean:对象中没有实例变量(成员变量),不能保存数据,可以在多线程环境下共享,是线程安全的 2 ...

  5. BI工具革命派vs传统强者:DataFocus.ai与Tableau的终极对决

    1. 摘要 DataFocus.ai 作为新一代商业智能工具,强调基于搜索的分析方式,旨在让业务用户能够轻松进行数据探索.该平台集成了数据仓库,并侧重于赋能非技术人员进行自助式分析.其核心理念是通过自 ...

  6. jmeter返回数据重新编码的方法

    下图内容为请求后的返回值,红色箭头内容是需要正则处理传参给后面的接口使用 其中==后面的\U0026为未编码内容 而实际能够提交的链接为下图"&" 所以,图1请求后需要先转 ...

  7. html中的em和rem到底该如何使用,自适应效果中如何确定文字大小/字号?

    如今手机屏幕繁多,自适应效果中如何确定文字大小/字号? em rem vm vw vh你都了解吗? 先说说em和rem em:继承父级的,假设html的font-size默认为16px,body字体大 ...

  8. 强化学习框架:OpenRLHF源码解读,模型处理

    强化学习框架:OpenRLHF源码解读,模型处理 本文主要介绍 强化学习框架:OpenRLHF源码解读,模型处理 models框架设计 了解一下 OpenRLHF的模型框架设计范式: From:htt ...

  9. K8s新手系列之ConfigMap资源

    概述 在 Kubernetes(K8s)中,ConfigMap 是一种 API 对象,用于将非机密性的数据保存到键值对中.Pod 可以将其用作环境变量.命令行参数或者存储卷中的配置文件. Config ...

  10. XXL-CACHE v1.2.0 | 多级缓存框架

    Release Notes 1.[增强]多序列化协议支持:针对L2缓存,组件化抽象Serializer,可灵活扩展更多序列化协议: 2.[优化]移除冗余依赖,精简Core体积: XXL- CACHE ...