【数据结构】--单链表力扣面试题②反转链表

news2024/10/2 3:17:04

目录

 法一:直接反转法

法二:头插法


题述:给你单链表的头结点head,请你反转链表,并返回反转后的链表。

题目已知链表创建,并给了reverseList的函数头。

struct ListNode* reverseList(struct ListNode* head)

 

示例3:

输入:head = [ ]

输出:[ ]

思考:创建一个新链表,然后值是逆置的行吗?不行!因为题目要求的是在原链表上逆置,改变原链表的指向,并不是值的拷贝后的逆转。那其实总共有三种方法。法一,直接原地翻转。法二,头插法。法三,递归法。这里讲解法一法二。因为能用循环就用循环,没必要用递归,因为递归有缺陷,如果链表够长的话,肯呢个会造成栈溢出,栈的空间本来就不大。

 法一:直接反转法

思路:数据结构解题关键步骤:画图+写代码/调试(解题关键)

那么我们的思路可以是定义两个变量指针指向节点

 如图,我们可以让n2的next指针域指向n1,然后让n2指向现节点的下一节点,但是怎么找下一节点?遇到这种情况我们就可以再创建一个变量指针n3,这样就能找到下一节点了,因为这个过程需要遍历链表,所以需要n3

n1和n2是用来翻转链表的,n3是用来迭代的。

 一直迭代下去,终止条件:

终止条件应该就是n2==NULL,而不是第一次n3==NULL,因为此时若终止,n2的节点的指针域还未指向n1,最终可知新头结点是n1。

#include<stdio.h>
#include<stdlib.h>

struct ListNode
{
	int val;
	struct ListNode* next;
};
struct ListNode* reverseList(struct ListNode* head)
{
	if (!head)//如果为空 !NULL为真,则返回NULL
	{
		return NULL;
		//如果为空链表,则无需翻转,直接返回NULL,
		//如果此刻你不返回,那么会对NULL指针解引用,会非法访问内存
	}

	struct ListNode* n1, * n2, * n3;
	n1 = NULL;
	n2 = head;
	n3 = head->next;

	while (n2)//通过画图可知,n2为空时就是翻转完毕的时候
	{
		n2->next = n1;//翻转链表

		n1 = n2;//迭代
		n2 = n3;//迭代
		if (n3)//如果n3已经为NULL了,就没有必要走这个循环了
			n3 = n3->next;
	}

	return n1;
}
int main()
{
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
	n1->val = 1;
	n2->val = 2;
	n3->val = 3;
	n4->val = 4;
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = NULL;

	struct ListNode* head = reverseList(n1);
	struct ListNode* cur;
	for (cur = head; cur != NULL; cur = cur->next)
		printf("%d ", cur->val);

	return 0;
}

法二:头插法

思路:取原链表中的节点,头插到新链表newhead中。

 但是这里有一个疑问,怎么找到此节点的下一节点,他的指针域已经指向了新的头,所以同理,我们还是再创建一个变量next保存下一节点。

 

#include<stdio.h>
#include<stdlib.h>

struct ListNode
{
	int val;
	struct ListNode* next;
};
struct ListNode* reverseList(struct ListNode* head)
{//这种情况不用格外考虑是不是空链表的问题,因为如果是,循环都进不去,直接返回NULL
	struct ListNode* cur = head;
	struct ListNode* next = NULL;
	struct ListNode* newhead = NULL;
	while (cur)
	{
		next = cur->next;
		//头插
		cur->next = newhead;
		newhead = cur;
		//迭代往后走
		cur = next;
	}
	return newhead;
}
int main()
{
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
	n1->val = 1;
	n2->val = 2;
	n3->val = 3;
	n4->val = 4;
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = NULL;

	struct ListNode* head = reverseList(n1);
	struct ListNode* cur;
	for (cur = head; cur != NULL; cur = cur->next)
		printf("%d ", cur->val);

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven属性与版本管理

文章目录 1 属性1.1 问题分析1.2 解决步骤步骤1:父工程中定义属性步骤2:修改依赖的version 2 配置文件加载属性步骤1:父工程定义属性步骤2:jdbc.properties文件中引用属性步骤3:设置maven过滤文件范围步骤4:测试是否生效 3 版本管理 在这一章节内容中&#xff0c;我们将学习两个…

ROS学习(1)——ROS1和ROS2的区别

因为机器人是一个系统工程&#xff0c;它包括了机械臂结构&#xff0c;电子电路&#xff0c;驱动程序&#xff0c;通信框架&#xff0c;组装集成&#xff0c;调试和各种感知决策算法等方面&#xff0c;任何一个人甚至是一个公司都不可能完成机器人系统的研发工作 。但是我们又希…

【黑科技】基于GPT开发的4款免费AI办公神器,实用又强悍!

今天给大家推荐4个非常实用且非常强悍的工具&#xff0c;基于GPT开发的AI工具 &#xff0c;每一款都能够大大提升我们的学习和工作效率 &#xff0c;希望你能看到并在收藏的同时点个赞或关注&#xff0c;万分感谢 。 Chat2doc 这是一个对学生党和打工人都特别有用的AI工具 &a…

西米支付:数字人民币常识普及

1.1 什么是数字人民币&#xff1f; 数字人民币 (英文简称&#xff1a; e-CNY) 是由人民银行发行的数字形式的法定货币 &#xff0c;由指定 运营机构参与运营 &#xff0c;以广义账户体系为基础 &#xff0c;支持银行账户松耦合功能 (意味着用户既可 以选择将数字人民币钱包与自…

GstOverlay 绑定多个gtk 窗口

主题说明 在spice stream 模式下&#xff0c;为了实现流畅的显示&#xff0c;利用gstvideooverlay 接口实现了gstreamer pipeline 的输出直接绑定到gtk 的窗口下。 然而spice客户端采用的是playbin 插件当前只能绑定一个窗口&#xff0c;当需要采用多窗口模式时&#xff0c;当…

VMware安装win10虚拟机教程及常见问题

win10虚拟机安装教程 一、前言 1. 准备VMware虚拟机&#xff08;可自行到VMware官网 或 点击链接 下载正版VMware Workstation Pro&#xff09;。 2. 准备需要安装的win10镜像&#xff0c;下载地址&#xff1a;下载 Windows 10。 3. 文章不一定合适每位安装虚拟机的人&#x…

代理模式及对startActivity的Hook应用

定义 简而言之&#xff0c;就是让代理类和目标类&#xff08;被代理类&#xff09;实现同一个接口&#xff0c;并让代理类持有一个目标类的对象&#xff0c;这样对代理类的访问&#xff0c;可以转移到目标类的访问中去。我们可以在不修改目标类的情况下&#xff0c;在代理类中实…

Cesium源码分享--标绘

Cesium标绘插件 在线api文档说明 在线体验地址1&#xff08;三维框架内&#xff09; 在线体验地址2 更多案例地址 免费gis数据 ps&#xff1a;如果可以的话&#xff0c;希望大家能给我个star&#xff0c;好让我有更新下去的动力&#xff1b; 实现原理&#xff1a; 其中实…

RSS订阅无需代码连接飞书自建的方法

RSS订阅用户使用场景&#xff1a; 公司为倡导员工阅读文化以及提高自身素质&#xff0c;通过RSS订阅一些书籍&#xff0c;然后由相关部分负责人每日推送到部门群&#xff0c;便员工们能够随时获取到最新的读书消息。但负责人时常会忘记&#xff0c;且人工手动复制粘贴多项信息比…

使用底层代码(无框架)实现卷积神经网络理解CNN逻辑

首先将数据集放入和底下代码同一目录中&#xff0c;然后导入一些相关函数的文件cnn_utils.py&#xff1a; import math import numpy as np import h5py import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.python.framework import ops def load_data…

Win10搭建Docker Desktop并安装vim

Win10搭建Docker Desktop 1 介绍 Docker Desktop是适用于Windows的Docker桌面&#xff0c;是Docker设计用于在Windows 10上运行。它是一个本地 Windows 应用程序&#xff0c;为构建、交付和运行dockerized应用程序提供易于使用的开发环境。Docker Desktop for Windows 使用 Wi…

shell脚本基本操作及案例

本文介绍了shell脚本的基本建立过程&#xff0c;并举了4个案例。关键是例3的shell脚本检测局域网ip地址机器是否宕机&#xff0c;例4的shell脚本获取本机ip地址 一、第一个shell脚本 1、定义解释器 #&#xff01;/bin/bash echo "hello world" #! 是一个约定的标记…

今天面了个京东拿28K 出来的,让我见识到了测试界的天花板

今年的春招基本已经结束了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的软件测试面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#…

【Android】基于Airtest实现大麦网app自动抢票程序

0x01 缘起 疫情结束的2023年5月&#xff0c;大家对出去玩都有点疯狂&#xff0c;歌手们也扎堆开演唱会。但演唱会多&#xff0c;票一点也不好抢&#xff0c;抢五月天的门票难度不亚于买五一的高铁票。所以想尝试找一些脚本来辅助抢票&#xff0c;之前经常用selenium和request做…

探索未来智能交通:网联汽车与汽车互联

网联汽车是指配备多种传感器和通信设备&#xff0c;并且能够接入互联网的汽车。这种汽车可以与外部环境进行交互&#xff0c;并利用各种技术&#xff08;如 GPS 导航、娱乐系统、诊断传感器和通信工具等&#xff09;实现数据的传输和接收。 网联汽车能够与其他车辆、交通基础设…

ChatGPT 引发AI服务器霸屏?AI服务器和普通服务器不同在哪?

​  近阶段&#xff0c;由于 ChatGPT 的横空问世&#xff0c;引发 AI 服务器再一次热潮来袭。随之而来的是&#xff0c;越来越多的企业和机构开始关注 AI 服务器和普通服务器之间的区别和对比。那么AI服务器到底是什么意思&#xff0c;它与普通服务器相比又有哪些差异呢? AI…

MySQL高级——第15章_锁

第15章_锁 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题&#xff0c;当多个线程并发访问某个数据的时候&#xff0c;尤其是针对一-些敏感的数据(比如订单、金额等)&#xff0c;我们就需要保证这个数据在任何 时刻最多只…

动态规划进阶

文章目录 状压dp小国王玉米田炮兵阵地 状压dp 小国王 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class Main{static BufferedReader br new Bu…

Day25力扣刷題

131.分割回文串 此題思維和前幾題不一樣&#xff0c;思維容量更大&#xff0c;主要在於返回的時候&#xff0c;還是會取值。 運行代碼&#xff1a; class Solution:def partition(self, s: str) -> List[List[str]]:result[]tt[]def backtrack(s,index):if len(s)index:res…

node.js PM2部署项目

pm2 是什么 pm2 是一个守护进程管理工具,它能帮你守护和管理你的应用程序。通常一般会在服务上线的时候使用 pm2 进行管理。本文围绕以下重点进行讲解&#xff1a;安装pm2&#xff1b;命令行部署到PM2&#xff1b;PM2查看日志等命令&#xff1b;PM2进行负载均衡&#xff1b;PM…