算法练习之反转链表

2023-11-05

        比较久没有写算法题了。还是应该复习回顾一下,这次用新学的 rust 语言来解决算法问题。个人认为学习算法题目重要的不是解法,而是解法背后的思想。要从每一道题目中学习到解决问题的思路。

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000  

        反转链表可以说是计算机专业入门级最简单的算法了。我认为这道题目其实背后的思想是temp 交换。我们知道当交换,A、B两个变量的值的时候,需要引入一个额外变量 temp

temp = A

A = B

B = temp

同样的对于本地,我们需要引入一个 next/prev变量,来让我们反转的过程顺利进行

 NULL         1->2->3->4->5->NULL

   ↑               ↑

prev        current

NULL  <- 1         2->3->4->5->NULL

    ↑          ↑         ↑

prev    current     next

NULL  <- 1         2->3->4->5->NULL

               ↑          ↑

            prev     current

可以看出来,当我们形成出需要的反转链表时候,前半段与后半段就已经割裂出来,所以,我们需要三个变量,来保证我们仍然可以继续遍历。

pub struct Solution {}
impl Solution {
    // 需要搞明白,什么是 take
    // take 方法可以从 option 中取出值,为原来的 Option 变量留下 None 值,但原来的变量还有效
    // take 方法的原始值或者引用必须为mut 类型。
    // Takes the value out of the option, leaving a None in its place.
    pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        if head.is_none() {
            return None;
        }
        let mut prev = None;
        let mut current = head;
        while let Some(mut tmp) = current.take() {
            let next = tmp.next.take();
            tmp.next = prev.take();
            prev = Some(tmp);
            current = next;

        }
        return prev;
    }
}
fn list_node() {
    let tail = ListNode::new(1);
    let head = ListNode {
        val: 1,
        next: Some(Box::new(ListNode {
            val: 2,
            next: Some(Box::new(ListNode { val: 3, next: Some(Box::new(ListNode { val: 4, next: None })) })),
        })),
    };

    let mut revert_node = Solution::reverse_list(Some(Box::new(head)));
    /**
    as_ref是转引用函数,将具有所有权对象转换成引用对象,在不改变被转换对象的基础上产升一个引用对象
    as_ref并不是所有类型都默认支持,很多时候需要自己去声明。是 ASRef trait的公共接口方法,只有那些实现了 as_ref公共接口方法
    的类型磁能使用 as_ref,目前有 Option,Box,Result 这三种类型默认支持 as_ref
    */
    let mut cur = revert_node;
    // 如果选项是 Some 值,则返回 true
    while cur.is_some() {
        // 可以的看到,unwrap 使用了 cur 的所有权,所以。我们只能移动出来,在使用一次。
        let value = cur.unwrap();
        println!("{}",value.val);
        cur = value.next;
        // 而不能这样做
        // println!("{}", cur.unwrap().val);
        // cur = cur.unwrap().next
    }
}

        使用 rust 的时候,比较麻烦的就是所有权问题。尤其是操作指针的时候。在执行

tmp.next.take()

的时候,需要写 take(),该方法的作用是,取出 option 中的数据,并将其至为 None。如果我们不这样做,会发现 tmp.next的所有权被转移给了 next 变量,下面将不能再给tmp.next赋值,而使用 take 方法则不会转移所有权。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法练习之反转链表 的相关文章

  • SpringBoot中的注解@SpringBootApplication和(@Configuration......)

    以下选自官方的文档 这里写链接内容 Many Spring Boot developers always have their main class annotated with Configuration EnableAutoConfig
  • Ping报文分析

    打开Windows虚拟 执行ipconfig的操作 用Kali执行Ping操作 并用Kali自带wireshark分析 可以看到Ping报文发送的是ICMP数据报文 通过网上查阅资料可知 ICMP报头格式 ICMP报文包含在IP数据报中 I
  • yolov5使用

    参考网址 https zhuanlan zhihu com p 501798155 源码下载及使用 release下载source及pt文件 yolov5s pt https github com ultralytics yolov5 ta

随机推荐

  • c# 连接Oracle数据库必须安装客户端吗

    以下方案在oracle9 10上测试通过 其他版本恕不一一测试 复制以下几个文件 从oracle xe 10g中提取的 到应用程序根目录即可 若有使用tns 请再建立tnsnames ora文件 oci dll ociw32 dll ora
  • 【Excel VBA】得到最后数据的行数

    纲举目张 得到最后数据的行数 说明 代码 code 解析 拓展 得到最后数据的行数 说明 在编写代码时我们时常用到的是 取得数据表的最后一行数据所在的行号 这样在编写循环语句时就不用猜着自定义终止值 代码 code Dim FinalRow
  • Vue 的实用开发技巧

    文章目录 v for 中使用 key 何时使用何种key 所以使用 index 作为 key 需要满足 哪何时使用 id 作为 key 呢 v if v else if v else 中使用 key 使用条件 例子 v for 和 v if
  • 共享DLL中使用MFC 和在静态库中使用MFC

    使用VS2008 在项目属性中有一项MFC的使用 有三种设置 1 使用标准Windows库 2 在共享DLL中使用MFC 3 在静态库中使用MFC 第一种顾名思义 第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中 所以EX
  • 树莓派4B 安装preem-PT 实时系统那些坑

    拿到一个树莓派之后 最好uname a 看一下内核版本号 比如同样的树莓派4B 不同出厂批次和时间 是有一定改动的 比如有些是4 14 4 19 而有些是5 4 5 15 等 较新的树莓派如果向下刷固件 比如用树莓派最新的4B 刷ubunt
  • ZooKeeper集群环境搭建

    大数据学习记录篇 持续更新中 个人主页 beixi 本文章收录于专栏 点击传送 大数据学习 持续更新中 感谢各位前辈朋友们支持学习 文章目录 1 ZooKeeper集群环境介绍 2 搭建环境准备 3 搭建步骤 1 ZooKeeper集群环境
  • 网络安全事件应急响应实战

    一 应急响应 1 Window入侵排查 当企业发生黑客入侵 系统崩溃或其它影响业务正常运行的安全事件时 急需第一时间进行处理 使企业的网络信息系统在最短时间内恢复正常工作 进一步查找入侵来源 还原入侵事故过程 同时给出解决方案与防范措施 为
  • hyper-v开启与关闭

    1 控制面板 2 服务 以管理员身份运行msconfig 3 cmd命令 以管理员运行 开启 上次关闭docker服务时 重新启动虚拟化技术执行了上面个两个步骤 未执行下面命令 检查了好久查了网上的资料才想起来 bcdedit set hy
  • java 遍历map 方法 集合 五种的方法

    package com jackey topic import java util ArrayList import java util HashMap import java util Iterator import java util
  • git如何克隆代码

    首先你要去官网安装 Git Downloads 下载好了一直下一步就行 找到一个装文件的文件夹右击 点击git bash here 然后 git clone 加上git上的网址 回车就可以下载了 希望有帮助到你
  • crm服务器 系统盘,crm搭建云服务器

    crm搭建云服务器 内容精选 换一换 购买多台云服务器时 有以下两种方式设置有序的云服务器名称 自动排序 购买多台云服务器时自动按序增加4位数字后缀 正则排序 按照name prefix begin number bits name suf
  • Windows系统缺失crypt32.dll文件导致程序无法运行解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个crypt32
  • JDBC的两种实现方法及区别

    文章目录 toc JDBC 一 JDBC简介 二 通过DriverManager实现JDBC 三 通过DataSource实现JDBC 四 DataSource和DriverManager的区别 JDBC 一 JDBC简介 JDBC Jav
  • JPA最终对象转换为sql的位置

    这里以spring data jpa 3 1 1版本为例 Jpa最终是采用的hibernate进行数据库查询 因此其最终由对象转为sql的语句可以在 类ConcreteSqmSelectQueryPlan gt 方法listInterpre
  • openMPI在Linux环境下的安装和部署

    Linux环境背景 CentOS7 安装步骤 进入官网openmp org 下载压缩包openmpi 4 1 4 tar gz 将openmpi 4 1 4 tar gz放到 opt文件夹内 解压tar zxvf openmpi 4 1 4
  • vscode ~~出现黄色波浪线,解决办法~

  • SPSS(八)logistic回归(图文+数据集)

    SPSS 八 logistic回归 我们之前的线性回归也好 线性回归衍生方法也好 非线性回归也好 因变量的类型都是连续性的 假如因变量的类型是分类的呢 logistic回归针对的是二分类的因变量 logistic回归 基于线性回归模型发展而
  • VS2010每次调试都出现“此项目已经过期”提示

    问题描述 最近因为项目需要 开发平台从VS2005切换成了VS2010 把一些老项目也转换到VS2010平台 因为是从低到高升级 微软还是做了很多兼容 基本上可以无缝切换 编译调试也基本正常 但是发现有些项目 尤其是比较大的项目 刚刚编译完
  • 1.linux安装oracle12c及测试连接(详细讲解)

    1 虚拟机配置 系统Centos7 6 CPU 4H 内存 4G 硬盘 128G GUI 有 2 安装前准备 2 1配置静态IP 我们是安装服务 一个服务主机IP地址不应该的变化的 所以设置为静态 vim etc sysconfig net
  • 算法练习之反转链表

    比较久没有写算法题了 还是应该复习回顾一下 这次用新学的 rust 语言来解决算法问题 个人认为学习算法题目重要的不是解法 而是解法背后的思想 要从每一道题目中学习到解决问题的思路 定义一个函数 输入一个链表的头节点 反转该链表并输出反转后