【牛客网】BM1:翻转链表
今天打算开启新一轮刷题了,必须得刷了,再不刷就得成废物了。
也希望看我博客的老哥能监督一下我,一起进步嘛!
题目BM001
打算从牛客网的面试top101开始刷起来,今天是BM001反转链表
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:
0≤n≤1000
要求:空间复杂度
O(1)
,时间复杂度O(n)
。
解法1:循环
最简单的办法就是用指针来一个一个修改链接,每次都将当前节点的next链接为上一个节点,最终再将开头的节点(单独存一下原本的开头)的next链接为空,返回最后一个节点即可。
很常规的写法,参考注释
1 | class Solution |
解法2:递归
一般面试的时候,面试官更希望看到递归的办法,因为这样的代码更加简洁,思路也更加有挑战性(反正你就要往难的办法想)
递归的思路也是让下一个节点的next链接为当前节点。主要在于递归的末端条件应该是head->next==nullptr
的时候就需要退出了,因为此时 head->next->next
是无效的,没有办法进行链接。
整个过程大概就是下面这个简图了,其中方框代表的是节点,圆形代表每一步
上代码,这里将 head->next = NULL;
是为了操作第一个节点(原视链表的首节点)的时候,将下一位改成空。而在中间节点的时候,因为当前节点的next会在上一层递归的时候被修改回去,所以设置为空不会出现问题。
1 | ListNode *ReverseList(ListNode *head) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 慕雪的寒舍!
评论