15天算法入门(五)

简介: 今天考察的是双指针加链表的操作。必须要回顾一下链表的反转、删除、增加等基础操作,最为经典的还是取中间数的几种情况。

网络异常,图片无法展示
|


网络异常,图片无法展示
|
今天考察的是双指针加链表的操作。必须要回顾一下链表的反转、删除、增加等基础操作,最为经典的还是取中间数的几种情况。


链表的中间节点


题目


给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.


题解


使用快慢指针,快指针一次走两格,慢指针一次一格。这样返回的慢指针正好指向中间节点。


只是需要考虑的是:节点是欧偶数个的时候,中间节点返回的是第二个节点。节点上取整还是下取整是根据快慢指针的起始位置决定的。

  • 如果偶数个上取整的话,直接从头节点开始:快指针两格,慢指针一格。
  • 如果偶数个下取整的话,就要从头节点的下一个节点开始,这样才能确保快指针走完后,慢指针指向的是中间节点的第二个节点。

网络异常,图片无法展示
|

网络异常,图片无法展示
|

代码

var middleNode = function (head) {
    if (head == null || head.next == null) return head
    let f = head.next, s = head.next
    while (f.next != null && f.next.next != null) {
        s = s.next
        f = f.next.next
    }
    return s
};


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


题目


给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]


题解


这题依旧使用快慢指针来解决。不过题目求的是到第N个,我们可以将快指针先走N步,然后让快慢指针同时同向而行,直到快指针遍历完成。


此时,慢指针正好指在到数第N+1的位置,然后使用链表的删除操作将N位置的节点删除。


最后直接返回原链表即可。

网络异常,图片无法展示
|

代码


var removeNthFromEnd = function (head, n) {
    if (head == null) return head
    let f = head, s = head
    while (n) {
        f = f.next
        n--
    }
    if (f == null) return head.next
    while (f.next != null) {
        f = f.next
        s = s.next
    }
    s.next = s.next.next
    return head
};


题目来源:leetcode

目录
相关文章
|
2月前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
2月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
2月前
|
存储 算法 编译器
算法入门:剑指offer改编题目:查找总价格为目标值的两个商品
给定递增数组和目标值target,找出两数之和等于target的两个数字。利用双指针法,left从头、right从尾向中间逼近,根据和与target的大小关系调整指针,时间复杂度O(n),空间复杂度O(1)。找不到时返回{-1,-1}。
|
5月前
|
机器学习/深度学习 数据采集 算法
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
你天天听“数据挖掘”,可它到底在“挖”啥?——数据挖掘算法入门扫盲篇
126 0
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
9月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
699 2
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)

热门文章

最新文章