[LC] 328. Odd Even Linked List

本文分享了解决LeetCode上奇偶链表问题的两种方法,一种使用三个指针进行链表分拆,另一种仅用两个指针实现更简洁的遍历。通过实例解析,深入探讨了链表操作技巧。

https://leetcode.com/problems/odd-even-linked-list/

很久没有试过不看提示自己很快解决一道medium题了,今天终于搞定了一道。也不知道是不是因为太简单了。。
这题一个很直接的一个想法就是将链表先分拆成两条链,一条odds链一条even链然后odds链连接even链就可以了。关键就是如何分拆了。我看到这题目的时候让我有点想到当年我遇到的第一条LinkedList相关的算法题,reverse a linkedlist,这一题in place的做法是利用前中后三个指针不停往下循环。然后我试着画了一下,如果这一题也是三个指针,前中后,会如何。结果发现....就做出来了。首先是三个指针,prev, curr, next,prev最开始是head,curr最开始是head.next(并且这个curr其实就是分拆的两条链的第二条链的头),next就是curr.next(如果有的话)。然后就不停这么一个循环:prev.next = next; prev = curr; curr = next; next = next.next; 直到curr == null。此时两条链就形成了,然后再从head找到第一条链的最后一个点,和第二条链的头连起来,就行了。说起来有点抽象,自己画一画操作一下就明白了。就此,给出代码如下:

    public ListNode oddEvenList(ListNode head) {
        if (head == null) return null;

        ListNode secondHead = head.next;
        ListNode prev = head, current = head.next, next = current == null ? null : current.next;
        while (current != null) {
            prev.next = next;
            prev = current;
            current = next;
            next = next == null ? null : next.next;
        }
        
        ListNode tail = head;
        while (tail.next != null) {
            tail = tail.next;
        }
        
        tail.next = secondHead;
        return head;
    }

基本上,第一个while loop这就是一个很安全的,把当前的节点的next连接到当前的节点的next的next并且还能遍历完整条链表的一个做法。在这个连接的过程里,两条链表就自动分拆完成了。当然,我见到提交的答案里有一个很屌的只遍历一遍并且只用两个临时节点就完成的做法,给出代码参考一下就好了。我觉得我要面试的话我就会给刚才自己想到的代码就好了:

    public ListNode oddEvenList(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode odd = head, even = head.next, evenHead = even;
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }

这个做法的思路其实就很明晰了,一开始就分清楚了odd链和even链的头,odd链不停往下连自己该连接的节点,even链不停往下连自己该连接的节点。odd指向的必然就是odd链的结尾,直接连even链的头就可以了。比我的更聪明些。

训练数据保存为deep_convnet_params.pkl,UI使用wxPython编写。卷积神经网络(CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,在计算机视觉、语音识别、自然语言处理等多个领域有广泛应用。其核心设计理念源于对生物视觉系统的模拟,主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。 **1. 局部感知与卷积操作** 卷积层是CNN的基本构建块,使用一组可学习的滤波器对输入图像进行扫描。每个滤波器在图像上滑动,以局部区域内的像素值与滤波器权重进行逐元素乘法后求和,生成输出值。这一过程能够捕获图像中的边缘、纹理等局部特征。 **2. 权重共享** 同一滤波器在整个输入图像上保持相同的权重。这显著减少了模型参数数量,增强了泛化能力,并体现了对图像平移不变性的内在假设。 **3. 池化操作** 池化层通常紧随卷积层之后,用于降低数据维度并引入空间不变性。常见方法有最大池化和平均池化,它们可以减少模型对微小位置变化的敏感度,同时保留重要特征。 **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起。随着网络深度增加,每一层逐渐提取更复杂、更抽象的特征,从底层识别边缘、角点,到高层识别整个对象或场景,使得CNN能够从原始像素数据中自动学习到丰富的表示。 **5. 激活函数与正则化** CNN中使用非线性激活函数来引入非线性表达能力。为防止过拟合,常采用正则化技术,如L2正则化和Dropout,以增强模型的泛化性能。 **6. 应用场景** CNN在诸多领域展现出强大应用价值,包括图像分类、目标检测、语义分割、人脸识别、图像生成、医学影像分析以及自然语言处理等任务。 **7. 发展与演变** CNN的概念起源于20世纪80年代,其影响力在硬件加速和大规模数据集出现后真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构推动了CNN技术的快速发展。如今,CNN已成为深度学习图像处理领域的基石,并持续创新。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值