当前位置:网站首页>LeetCode每日一练 —— 206. 反转链表
LeetCode每日一练 —— 206. 反转链表
2022-07-27 18:33:00 【飞向星的客机】
前言
Wassup guys!我是Edison
今天是 LeetCode 上的 leetcode 206. 反转链表
Let’s get it!

1. 题目分析
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
示例 2:
示例 3:
2. 题目图解
这道题有两种解法
思路一:三指针反转
定义 3 个指针 n1、n2、n3:
指针 n1 指向 NULL;
指针 n2 指向头节点;
指针 n3 指向第二个节点,也就是 n2->next;
n1 和 n2 是为了 倒 指针的指向,n3 是为了保存下一个(如图所示)。
第 1 步,把 n2 的 next 指向 n1(如图所示)
然后把 n2 的地址赋给 n1,把 n3 的地址赋给 n2,n3 等于 n3 的 next (如图所示)
再按照以上的步骤迭代往后循环走,当 n2 指向 NULL(空) 时,就结束循环,此时链表反转成功(如图所示)
此时,新的头节点就是 n1,直接返回即可。
要注意:
(1)如果是一个空链表,那么直接返回 NULL。
(2)如果 n3 的 next 不为空,那么 才执行 n3 = n3->next
接口代码
struct ListNode* reverseList(struct ListNode* head){
if (head == NULL) {
return NULL;
}
struct ListNode* n1 = NULL;
struct ListNode* n2 = head;
struct ListNode* n3 = n2->next;
while (n2) {
n2->next = n1;
n1 = n2;
n2 = n3;
if (n3) {
n3 = n3->next;
}
}
return n1;
}
提交结果
思路二:头插法
定义指针 cur 指向链表的头节点;
再创建一个新链表,并把新链表的头定义为 newHead ,指向 NULL;
然后 cur 取原链表节点,然后头插到 newHead 所在的新链表。
思路就是:遍历 旧链表,把节点拿到 新链表,进行头插
在进行头插之前,定义一个 curNext 用于保存 cur 指向的 next。(如图所示)
第 1 步,把 cur 的 next 指向 newHead,如图所示
然后更新 newHead(newHead = cur) ,并且让 cur(cur = curNext) 走到原先 curNext 的位置,然后让 curNext 走到它的 next 位置(如图所示)
第 2 步,把 cur 的 next 指向 newHead,如图所示
然后更新 newHead(newHead = cur) ,并且让 cur(cur = curNext) 走到原先 curNext 的位置,然后让 curNext 走到它的 next 位置(如图所示)
第 3 步,把 cur 的 next 指向 newHead,如图所示
然后更新 newHead(newHead = cur) ,并且让 cur(cur = curNext) 走到原先 curNext 的位置,然后让 curNext 走到它的 next 位置(如图所示)
第 4 步,把 cur 的 next 指向 newHead,如图所示
然后更新 newHead(newHead = cur) ,并且让 cur(cur = curNext) 走到原先 curNext 的位置,然后让 curNext 走到它的 next 位置(如图所示)
此时还剩最后一个,cur 还不为空,那么就继续把 cur 的 next 指向 newHead,如图所示
此时 curNext 已经为空了,它的 next 位置不存在,所以不再执行 curNext = curNext->next;
然后更新 newHead(newHead = cur) ,并且让 cur(cur = curNext) 走到原先 curNext 的位置(如图所示)
注意:当 cur 为空时,循环就终止了,那么链表就反转完成!
接口代码
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* cur = head;
struct ListNode* newHead = NULL;
while (cur) {
// 头插前保存cur的下一个节点
struct ListNode* curNext = cur->next;
// 头插
cur->next = newHead;
newHead = cur;
cur = curNext;
if (curNext) {
curNext = curNext->next;
}
}
return newHead;
}
提交结果
边栏推荐
猜你喜欢

NPDP|什么样的产品经理可以被称为优秀?

如何让个性化推荐即刻触达?云原生数据库GaussDB(for Redis)来助力

NATAPP内网穿透工具外网访问个人项目

adb shell ls /system/bin(索引表)

人脸识别5.1- insightface人脸检测模型训练实战笔记

Introduction to rk3399 platform introduction to proficient series (Introduction) 21 day learning challenge

Source Insight 4.0使用介绍

如何对话CIO/CTO
![[deep learning] pytoch torch Autograd automatic differential engine](/img/c8/2ce1e5c02283965f8690ac5a9971a9.png)
[deep learning] pytoch torch Autograd automatic differential engine

How does the industrial switch enter the web management interface?
随机推荐
[numpy] array index and slice
LeetCode-209-长度最小的子数组
Force deduction solution summary 592 fraction addition and subtraction
金仓数据库 KingbaseES异构数据库移植指南 (2. 概述)
How to improve the picture transmission speed and success rate in the development of IM instant messaging under the mobile network
[Numpy] 广播机制(Broadcast)
Hexagon_V65_Programmers_Reference_Manual(9)
品牌列表案例
Source Insight 4.0使用介绍
MySQL基本查询和运算符
Xdc 2022 Intel technology special session: Intel Software and hardware technology builds the cornerstone of cloud computing architecture
搭建discuz论坛并攻破盗取数据库
《SRE:Google运维解密》读后有感
实名认证在文旅出行行业的应用场景有哪些?
R语言使用t.test函数执行t检验验证总体均值是否是某个特定的值(从样本集推论总体均值)
Hexagon_V65_Programmers_Reference_Manual(6)
To do the test, you have to go to the big factory and disclose the "hidden rules" of bat big factory recruitment internally
Kingbasees heterogeneous database migration guide (2. Overview)
R语言使用dplyr包进行数据聚合统计计算滑动窗口统计值(Window Statistics)、计算滑动分组均值(mean)并合并生成的统计数据到原数据集中
一种比读写锁更快的锁,还不赶紧认识一下