首页 > 其他分享 >2023.6.11 从链表中删去总和值为0的节点

2023.6.11 从链表中删去总和值为0的节点

时间:2023-06-11 13:00:14浏览次数:48  
标签:11 mut dummy sum 值为 next 链表 let new

image

对一个序列进行前缀和处理,假设p处前缀和与q处前缀和相等,说明\((p, q)\)之间的序列和为0。

因此我们可以遍历一次链表,预处理出前缀和,同时用哈希表记录,哈希表的key为前缀和,value为所处节点。遇到相同的key时,直接覆盖,这样哈希表存储的就是前缀和为key的最后一个节点。

第二次遍历链表,根据当前节点的前缀和,查找哈希表中存储的具有相同前缀和的最后一个节点,两个节点之间的连续和为0,因此直接删去。重复该操作,就可以得到答案。

// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
//   pub val: i32,
//   pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
//   #[inline]
//   fn new(val: i32) -> Self {
//     ListNode {
//       next: None,
//       val
//     }
//   }
// }
use std::collections::HashMap;
impl Solution {
    pub fn remove_zero_sum_sublists(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        if head.is_none() { return head; }

        let mut dummy = Box::new(ListNode::new(0));
        dummy.next = head; // 此处发生移动,head的所有权已经被移动至dummy

        let mut map = HashMap::new();
        let mut sum = 0;
        let mut p = dummy.next.as_ref(); // p是可改变引用对象的不可变引用
        map.insert(0, dummy.as_ref());

        while let Some(_p) = p
        {
            sum += _p.val;
            p = _p.next.as_ref();
            map.insert(sum, _p.as_ref());
        }

        // 不能使用dummy,因为dummy已经有了不可变引用(HashMap中),就不能再创建它的可变引用
        let mut ans = Box::new(ListNode::new(0));
        let mut p = Some(&mut ans); // p是可改变引用对象的可变引用
        sum = 0;

        while let Some(_p) = p
        {
            sum += _p.val;

            if let Some(q) = map.get(&sum)
            {
                _p.next = match q.next.as_ref() {
                    Some(next) => Some(Box::new(ListNode::new(next.val))),
                    None => None,
                }
            }
            p = _p.next.as_mut();
        }

        ans.next
    }
}

标签:11,mut,dummy,sum,值为,next,链表,let,new
From: https://www.cnblogs.com/st0rmKR/p/17472808.html

相关文章

  • win11 右键添加 .md 文件快捷方式
    尝试用常用方法添加.xmind.md文件,xmind文件成功,但是md文件不成功,因此记录解决方法参考详细方法https://www.cnblogs.com/stblack/p/16637219.html注册表相关https://www.cnblogs.com/sepmaple/articles/9401215.html问题:按照常用方法添加后右键还是不出现md项解决:直......
  • 第11章 外观模式(Façade Pattern)
    外观模式(FaçadePattern)——.NET设计模式系列之十二Terrylee,2006年3月概述在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖......
  • 611随笔QAQ
    1.古诗词里的中国十大名花  何须浅碧深红色,自是花中第一流。---------------------------桂花  只道花无十日红,此花无日不春风。----------------------------月季  遥知不是雪,为有暗香来。----------------------------------------梅花  孤兰生幽园,众草共无......
  • 【已解决】MySQL连接错误 ERROR 1129 (00000): Host ” is blocked because of many c
     问题连接MySQL 报错 ERROR1129(00000):Host”isblockedbecauseofmanyconnectionerrors原因同一个IP在短时间内产生太多终端的数据库连接(超过mysql数据库max_connection_errors设置),导致被阻塞。在系统变量:max_connect_errors设置了允许中断的次数,超过了这个次数(或者......
  • 2023.6.1101.数据库基础介绍
    数据库基础介绍数据库概述数据库运维 1.认识MySQL什么是数据库数据库是⼀个⽤于存储和管理数据的电⼦化系统。我们可以把它想象成⼀个⼤型的⽂件柜,⾥⾯存储着各种类型的数据,例如个⼈信息、产品信息、订单信息等等。这些数据可以被组织、管理和检索,以⽅便⽤户快速地找到......
  • STM32+DHT11监测环境的温湿度
    【1】DHT11传感器DHT11是一种数字温湿度传感器,能够通过数字信号输出当前环境的温度和湿度值。DHT11可以通过一条数据信号线连接到微控制器或其他外设,从而实现温湿度的实时测量和数据读取。DHT11采用单总线通信协议,只需要连接一个数字信号线和两个电源线,即可实现传感器的数据读取。......
  • #yyds干货盘点# LeetCode程序员面试金典:环形链表
    题目:给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos不作为参数进行传递 。仅仅是为了标识链......
  • #yyds干货盘点# LeetCode程序员面试金典:移除链表元素
    1.简述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。 示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],val=7输出:[]2.代码实现:class......
  • 9.11 代理设计模式
    interfaceIEat{//定义核心业务标准publicvoidget();//业务方法}classEatRealimplementsIEat{//定义真实主题类publicvoidget(){System.out.println("【真实主题】得到一份食物,而后开始品尝美味");}}classEatProxyimplem......
  • 6.11学习总结
    不知不觉中以学习Java将近4个月了,在这几个月的学习中我从一开始的迷茫懵逼,到现在的懵逼迷茫中,写下了这篇这个学期课程的Java学习心得体会。首先,我认为作为一个该开始学习Java的小白,在开始学习之前无论你有多大的热情与信心,都会在之后的学习中被程序啪啪打脸,让你无限的迷茫与懵逼。......