LeetCode 203:移除链表元素 Remove LinkedList Elements

删除链表中等于给定值 val 的所有节点。

Remove all elements from a linked list of integers that have value val.

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

解题思路:

两种方法,一种是迭代法,从第一个节点开始,遇到值相同的节点就将其删除。链表的删除操作是直接将删除节点的前一个节点指向删除节点的后一个节点即可。

第二种方法是递归,用递归从后向前遇到相同节点直接指向该节点的下一个节点的地址即可

迭代法:

由于链表删除操作的特殊性,如果要删除某个节点,必须要知道该删除节点的前一个节点地址才可完成删除操作。所以如果是从第一个节点开始判断,就要考虑到第一个节点是否为空节点、第一个节点是否就是该删除的的节点,删除头节点和非头节点的操作不一样,应单独实现删除操作。

如果原链表是这种形式:1->1->1->2 val=1 删除头节点后第二个节点置为头节点,但是第二个节点作为新的头节点依然需要删除,所以对头节点的操作应该是一个迭代过程。

另外一种方法就是新建一个虚拟节点,该虚拟节点下一个节点指向原链表头节点。这就无需考虑头节点是否为空、是否为待删除节点。如原链表为:1->1->1->2 val=1 ,新建一个虚拟节点 -1 作为头节点:-1->1->1->1->2 val=1 ,这时只需正常迭代删除即可,唯一要注意是返回节点不能是 head ,因为原链表的头节点如果是待删除节点,此时 head 节点已被删除并作为单独隔离出来的节点,并非链表内的一个节点。

Java:

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode newHead=new ListNode(-1);//新建虚拟节点
        newHead.next=head;//虚拟节点作为原链表的头节点
        ListNode cur = newHead;//遍历节点的指针

        while (cur.next != null) {
            if (cur.next.val == val) {
                cur.next = cur.next.next;//删除操作
            } else {
                cur = cur.next;
            }
        }
        return newHead.next;//返回的头节点应当是虚拟节点的下一个节点
    }
}

Python3:

class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        newHead = ListNode(-1)
        newHead.next = head
        cur = newHead
        while cur.next:
            if cur.next.val == val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return newHead.next

递归法:

递归方法解该题很简单,基线条件是遇到空节点(最后一个节点),递归时只需将传递参数节点的下一个节点作为新的参数传给递归函数即可:

如原链表为: 1->2->6->3->4->5->6, val = 6 递归到空节点时最后一个递归函数返回null: 1->2->6->3->4->5->6->null 回到上一层递归函数内此时 head.next 得到返回节点 null 判断head为 6 删除,返回 head.next :1->2->6->3->4->5->null 回到上一层递归函数此时 head.next 得到上一层返回节点依然为null 判断head为 5 不删除,返回 head 为5:1->2->6->3->4->5->null 回到上一层递归函数此时 head.next 得到上一层返回节点 5 判断head为 4 不删除,返回 head 为4:1->2->6->3->4->5->null 回到上一层递归函数此时 head.next 得到上一层返回节点 4 ..............

直到回到第一个递归函数为止返回头节点结束。

Java:

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if (head == null) return null;//基线条件
        head.next = removeElements(head.next, val);
        if (head.val == val) {
            return head.next;
        } else {
            return head;
        }
    }
}

Python3:

class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        if not head: return None
        head.next = self.removeElements(head.next, val)
        if head.val == val:
            return head.next
        else:
            return head

欢迎关注公众号一起学习:爱写Bug

爱写Bug.png

转载于:https://my.oschina.net/u/3839146/blog/3075608

飞思卡尔智能车竞赛是一项备受关注的科技赛事,旨在激发学生的创新和实践能力,尤其是在嵌入式系统、自动控制和机器人技术等关键领域。其中的“电磁组”要求参赛队伍设计并搭建一辆能够自主导航的智能车,通过电磁感应线圈感知赛道路径。本压缩包文件提供了一套完整的电磁组智能车程序,这是一套经过实战验证的代码,曾在校级比赛中获得第二名的优异成绩。 该程序的核心内容可能涉及以下关键知识点: 传感器处理:文件名“4sensor”表明车辆配备了四个传感器,用于获取环境信息。这些传感器很可能是电磁感应传感器,用于探测赛道上的导电线圈。通过分析传感器信号的变化,车辆能够判断自身的行驶方向和位置。 数据采集与滤波:在实际运行中,传感器读数可能受到噪声干扰,因此需要进行数据滤波以提高精度。常见的滤波算法包括低通滤波、高斯滤波和滑动平均滤波等,以确保车辆对赛道的判断准确无误。 路径规划:车辆需要根据传感器输入实时规划行驶路径。这可能涉及PID(比例-积分-微分)控制、模糊逻辑控制或其他现代控制理论方法,从而确保车辆能够稳定且快速地沿赛道行驶。 电机控制:智能车的驱动通常依赖于直流电机或无刷电机,电机控制是关键环节。程序中可能包含电机速度和方向的调节算法,如PWM(脉宽调制)控制,以实现精准的运动控制。 嵌入式系统编程:飞思卡尔智能车的控制器可能基于飞思卡尔微处理器(例如MC9S12系列)。编程语言通常为C或C++,需要掌握微控制器的中断系统、定时器和串行通信等功能。 软件架构:智能车软件通常具有清晰的架构,包括任务调度、中断服务程序和主循环等。理解和优化这一架构对于提升整体性能至关重要。 调试与优化:程序能够在比赛中取得好成绩,说明经过了反复的调试和优化。这可能涉及代码效率提升、故障排查以及性能瓶颈的识别和解决。 团队协作与版本控制:在项目开发过程中,团队协作和版本控制工具(如Git)的应用不可或缺,能够保
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值