leetcode-JZ24
Posted Alan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode-JZ24相关的知识,希望对你有一定的参考价值。
题面
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
原题链接
分析
第一类做法
把链表遍历一遍,把变量存储起来,然后反过来建立一个新链表
这种做法很简单,可以用vector,也可以定义一个特定大小的数组。但是并不推荐,因为等于遍历了两次链表,还需要把链表中所有遍历存储起来。
时间复杂度:O(n)
空间复杂度:O(n)
第二类做法(推荐)
只遍历一次链表,遍历的过程中,就把指针指向改过来
这种做法有一个容易疏漏之处,即必须把链表第一个节点的next值设为NULL,否则,就像狗咬着自己的尾巴转圈,链表会无限长。
时间复杂度:O(n)
空间复杂度:O(1)
源代码(注释部分即为思路)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//特判
if(head==NULL){
return head;
}
ListNode* now = head->next;
ListNode* pre = head;
ListNode* later = head;
//这一步极其重要,我就是在这一步卡了半个小时
pre->next = NULL;
while(now != NULL){
later = now->next;
//更改指针方向
now->next = pre;
pre = now;
now = later;
}
//最终now的值必然为NULL
return pre;
}
};
以上是关于leetcode-JZ24的主要内容,如果未能解决你的问题,请参考以下文章
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试