[toc]
题目介绍
题目链接
https://leetcode-cn.com/problems/reverse-linked-list/description/
题目考点
链表,递归,迭代(用到了双指针),栈
题目难度
LeetCode-Easy
题目大意
给定1个链表,请将其反转
输入
链表的头结点
输出
反转后链表的头结点
题解一
解题思路
递归法
定义递归函数(函数功能是反转链表并返回链表反转后的头结点),将链表分成A(头结点)和B(头结点以外的其它结点)2部分,通过递归将链表B反转并得到其新的头结点,然后将A拼接在反转后链表B的尾部(注意链表B反转前其头结点正好是反转后的尾结点),最终返回新的链表(B)。
复杂度分析
假设链表有n个结点,则递归有n层,所以时间复杂度为$O(n)$,空间复杂度为$O(n)$。
代码
1 | class Solution{ |
题解二
解题思路
迭代法
本质就是头插法,需要用到双指针(1个遍历该链表,1个保存新链表的head),每取到1个结点就将其插入新链表的头部。
复杂度分析
假设链表有n个结点,则时间复杂度为$O(n)$、空间复杂度为$O(1)$。
代码
1 | class Solution{ |
题解三
解题思路
栈法
遍历链表并将结点压入栈中,然后出栈建立新链表。
复杂度分析
假设链表有n个结点,则时间复杂度为$O(2n)$、空间复杂度为$O(n)$。
代码
1 | class Solution{ |
题解四
解题思路
原地反转法(三指针法)
定义3个指针pre、cur、next,以2个结点(pre和cur)为单位遍历各个结点。对于每个当前结点cur将其与pre的顺序逆置(cur->next=pre)再分别先后将pre和cur更新为cur和next。
复杂度分析
假设链表有n个结点,则时间复杂度为$O(n)$、空间复杂度为$O(1)$。
代码
1 | class Solution{ |
参考链接
- https://leetcode-cn.com/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode/
- https://leetcode-cn.com/problems/reverse-linked-list/solution/si-lu-fen-xi-n-duo-chong-fang-shi-chu-li-ajn6/
作者:@臭咸鱼
转载请注明出处!
欢迎讨论和交流!