算法系列-力扣206-单链表反转
题目说明
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
方法一:头插法反转链表
思路:
- 声明p指针指向原头节点,并将头节点置空;
- p指针循环原链表将元素用头节点插入法逐个插入head中;(head为反转后链表头)
- 整个循环完毕,我们就能得到反转后的链表了,存储在head中。
head = A -> B -> C -> D -> null
p = head ; head = null;
head = null ;
A插入head p.next = head.next; head = p;
head = A -> null
B插入head
head = B -> A -> null
C插入head
head = C -> B -> A -> null
D插入head
head = D -> C -> B -> A -> null
整个反转完成
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {
ListNode p=head;
ListNode next=null;
head =null;
while(p!=null){next=p.next;p.next=head;head=p;p=next;
}
return head;}
}
算法分析
时间复杂度为O(n)
空间复杂度为O(1)
方法二:双指针局部反转
* head = 1 -> 2 -> 3 -> 4 -> null* null <- 1 2 -> 3 -> 4 -> null* null <- 1 <- 2 3 -> 4 -> null* null <- 1 <- 2 <- 3 4 -> null* null <- 1 <- 2 <- 3 <- 4 = head
思路:
1.声明cur和next两个指针,用cur指针指向当前需要处理节点,next指向cur下一个节点
2.cur起点为null,next起点为头节点
3.将next的后续节点指向cur这样就把next和原链表分离开来了,next和cur分别前进一步
4.继续3,直到next为null,cur就是反转后链表的头结点
` 思考1:为什么cur要从null开始,从第一个节点开始可以吗?为什么?
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {/*** head = 1 -> 2 -> 3 -> 4 -> 5 -> null * null <- 1 2 -> 3 -> 4 -> 5 -> null * null <- 1 <- 2 3 -> 4 -> 5 -> null * ...* null <- 1 <- 2 <- 3 <- 4 <- 5 = head* 1.用cur指针指向当前需要处理节点,next指向cur下一个节点* 2.将cur next进行局部反转* 3.cur和next前进一步继续2直到next指向链尾*/ListNode cur=null;ListNode next=head;ListNode tmp=null;while(next!=null){tmp = next.next;next.next=cur;// 前进一步cur=next;next=tmp; }return cur;}
}
方法三:递归反转
解题思路:
1.递归到最后一个节点作为表头节点即为revHead
2.在递归函数逐步返回的过程中将当前节点的后续节点指向当前节点
3.再当前节点后续节点置空,和原有链表分离,对于反转前链表的非头节点来讲不是必须的,为了简单统一处理
4.完成2-3步就完成一次局部反转,直到第一个调用处理完毕就得到反转后的链表
如下过程所示:
head = 1 -> 2 -> 3 -> 4 -> 5 -> null
head = 1 -> 2 -> 3 -> 4 -> 5 = revHead
head = 1 -> 2 -> 3 -> 4 null <- 4 <- 5 = revHead
head = 1 -> 2 -> 3 null <- 3 <- 4 <- 5 = revHead
head = 1 -> 2 -> 3 null <- 2 <- 3 <- 4 <- 5 = revHead
head = 1 -> null , null <- 1 <- 2 <- 3 <- 4 <- 5 = revHead
revHead = 5 -> 4 -> 3 -> 2 -> 1 -> null
递推公式:
node.next.next = node
node.next = null
终止条件:
node.next == null
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {/*** 1.递归到最后一个节点作为表头节点即为revHead* 2.在递归函数逐步返回的过程中将当前节点的后续节点指向当前节点* 3.再当前节点后续节点置空,和原有链表分离,对于反转前链表的非头节点来讲不是必须的,为了简单统一处理* 4.完成2-3步就完成一次局部反转,直到第一个调用处理完毕就得到反转后的链表* revHead* head = 1 -> 2 -> 3 -> 4 -> 5 -> null* head = 1 -> 2 -> 3 -> 4 -> 5 = revHead* head = 1 -> 2 -> 3 -> 4 null <- 4 <- 5 = revHead* head = 1 -> 2 -> 3 null <- 3 <- 4 <- 5 = revHead* head = 1 -> 2 -> 3 null <- 2 <- 3 <- 4 <- 5 = revHead* head = 1 -> null , null <- 1 <- 2 <- 3 <- 4 <- 5 = revHead* revHead = 5 -> 4 -> 3 -> 2 -> 1 -> null*/// 空判定if(head == null){return null;}// 递归终止条件:递归到最后一个节点时返回作为反转后链表的头结点if(head.next == null){return head;}ListNode revHead = reverseList(head.next);// 倒数第二个节点开始,对示例而言节点4才会进入到下面的逻辑head.next.next = head;head.next = null;return revHead;}
}
算法分析:
时间复杂度O(n)
空间复杂度O(n)
思考
思考1:为什么cur要从null开始,从第一个节点开始可以吗?为什么?
cur不一定非得初始为null也可以从第一个节点开始,只不过要额外处理一下头结点的逻辑,即第一个节点的时候需要把cur的后继节点置为空,
并且next的后续节点置为cur,
这样后续的操作就是一样的了。
public ListNode reverseList(ListNode head) {ListNode cur=head;ListNode next=head.next;cur.next=null;ListNode tmp=null;while(next!=null){tmp = next.next;next.next=cur;// 前进一步cur=next;next=tmp;}return cur;}
相关文章:
算法系列-力扣206-单链表反转
题目说明 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 方法一:头插法反转链表 思路: 声明p指针指向原头节点,并将头节点置空;p指针循环原链表将元素用头节点插入法逐个插入head中&…...
网络基础-应用层协议-HTTP/HTTPS
HTTP/HTTPS HTTP基本概念协议格式请求报文请求方法请求资源地址协议版本 应答报文 常见Header常见状态码与状态描述Cookie&Sessionhttp协议特点 HTTPS基本概念对称加密与非对称加密数据摘要&数据指纹HTTPS工作过程探究只采用对称加密只采用非对称加密双方都采用非对称加…...
problen(5)ubuntu版本问题
浅浅记录一下这段时间的血和泪吧,大概耗时快一个月了吧,终于解决了...... 因为需要开启pwn之旅,需要在Ubuntu上安装一些东西,就是下面的一条命令: sudo pip3 install pwntools -i Simple Index(显示不太好了…...
写一篇nginx配置指南
nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织: 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…...
rhel8防火墙firewalld操作
1.查看默认区域 [rootlocalhost r]# firewall-cmd --get-default-zone public2.查看网卡关联的区域 [rootlocalhost r]# firewall-cmd --get-zone-of-interfaceifcfg-ens160 external 3.设置网卡的默认区域修改为work [rootlocalhost r]# firewall-cmd --zonework --change…...
OpenCV项目实战(2)— 如何用OpenCV实现弹球动画
前言:Hello大家好,我是小哥谈。OpenCV能够在画布上绘制静态的图形,例如,线段、矩形、正方形、圆形、多边形、文字等。那么,能不能让这些静态的图形移动起来?如果能,又该如何编写代码呢ÿ…...
golang iris框架 + linux后端运行
go mod init myappgo get github.com/kataras/iris/v12latestpackage mainimport "github.com/kataras/iris/v12"func main(){app : iris.New()app.Listen(":port") }打包应用 go build main.go开启服务 #nohup ./程序名称 nohup ./main关闭后台 #ps -e…...
linux shell操作- 02 常用命令及案例
文章目录 常用命令 续 常用命令 续 定时任务 通过文本编辑cron任务,实现定时操作 分 小时 天 月 星期 绝对路径sh or cmd* 表示每个xxx,如每个小时每小时的第三分钟执行cmd-> 03 * * * * /home/lauf/scraw.sh每天的第5、8个小时执行-> 00 5,8 * *…...
考研408 | 【计算机组成原理】 数据的表示和运算
进位计数制 十进制计数法: 推广:r进制计数法 任意进制-->十进制: 二进制<-->八进制、十六进制: 各种进制的常见书写方式: 十进制-->任意进制: 十进制-->二进制(拼凑法ÿ…...
【小沐学NLP】AI辅助编程工具汇总
文章目录 1、简介2、国内2.1 aiXcoder2.1.1 工具特点2.1.2 部署方式2.1.3 使用费用2.1.4 代码测试2.1.4.1 代码搜索引擎2.1.4.2 在线体验 2.2 CodeGeeX2.2.1 工具特点2.2.2 部署方式2.2.3 使用费用2.2.4 代码测试 2.3 Alibaba Cloud AI Coding Assistant(cosy&#…...
linux动态扩容系统盘(非lvm磁盘)
查看磁盘状态 执行df -Th查看磁盘情况 [rootiotdbtest1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 7.7G 0 7.7G 0% /dev tmpfs tmpfs 7.7G 0 7.7G 0% /dev/shm tmpfs tmpfs …...
Gitlab仓库部署
Gitlab仓库部署 一、Gitlab的概述1、gitlab介绍2、gitlab主要功能3、gitlab和github的区别 二、部署环境1、安装依赖环境2、安装Postfix邮箱3、Gitlab优势4、Gitlab工作流程 三、Gitlab部署过程1、Yum安装Gitlab2、配置gitlab站点URL3、启动并访问Gitlab 四、Gitlab具体操作1、…...
Day46:项目-购物车案例
购物车案例 准备工作 首页默认加载,其余页面懒加载 调用defineStore方法构建store 入口main做对应配置,找指南,快速开始,把elementplus引入进来 import { createApp } from "vue"; import { createPinia } from &qu…...
【小沐学CAD】嵌入式UI开发工具:GL Studio
文章目录 1、简介2、软件功能3、应用行业3.1 航空3.2 汽车3.3 防御3.4 工业3.5 电力与能源3.6 医疗3.7 空间3.8 科技 结语 1、简介 https://disti.com/gl-studio/ DiSTI 是 HMI 软件、虚拟驾驶舱、仪表、信息娱乐、集群显示器和嵌入式 UI 解决方案的领先提供商。 而它的GL Stu…...
Python:Tornado框架之获取get和post的传参
一、获取get方式传参 import tornado.ioloop #导入tornado包 import tornado.web class MainHandle(tornado.web.RequestHandler):def get(self,id): #定义请求函数self.write("Hello %s!" %id)apptornado.web.Application([ #定义应用配置函数(r"/…...
JSON和全局异常处理
目录 1️⃣JSON 一、什么是json? 二、与javascript的关系 三、语法格式 四、注意事项 五、总结 六,使用json 1导入pom.xml依赖 2.配置spring-mvc.xml 3. ResponseBody注解使用 创建一个web层控制器 编写ClazzBiz 实现接口 测试: …...
骨传导耳机有害处吗、骨传导耳机真的不好用吗?
骨传导耳机没有害处。 骨传导耳机是通过将声音传递到颅骨,再由颅骨传递到内耳,从而达到听声音的效果,与传统的耳机不同。 因此,骨传导耳机不会直接对人的身体健康、耳朵产生压力和损伤,也不会影响耳道和中耳的正常功能…...
第一类曲面积分:曲面微元dσ与其投影面积微元dxdy之间的关系推导
第一类曲面积分:曲面微元dσ与其投影面积微元dxdy之间的关系推导 本篇博客精简自本人关于曲面积分的博客:详情见:曲面积分(Surface Integral) 曲面参数化(曲面上的每个点都使用起点为原点、终点为该曲面上的点的向量表示&#x…...
vue学习之Font Awesome图标
官方文档 https://fontawesome.com.cn/v5 Font Awesome 安装 cnpm install font-awesome/src/main.js 引入css import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;...
mysql内连接与外连接详解
内连接与外连接 内连接外连接 在数据库中,连接操作是一种把两个或者多个表的记录组合在一起的操作,常用的有内连接(Inner Join)、外连接(Outer Join)等。 内连接 内连接(Inner Join࿰…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
