Day25 2023/02/01
难度:简单
题目
给定一个单链表的头节点pHead(该头节点是有值的,不如在下图,他的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:0 <= n <=1000
要求:空间复杂度,时间复杂度:
示例
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
思路一
采用双指针法,分别定义两个指针pre和cur,其中pre指向cur的前驱节点,然后遍历链表依次让cur->next指向pre,即可完成翻转。
如图所示:
关键点
- 每次反转的时候由于
cur->next会指向pre从而导致丢失cur的下一个节点,所以循环一开始就要先暂存一下cur->next;
算法实现
c++代码实现-双指针法
Class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* tmp;
ListNode* cur = head;
ListNode* pre = nullptr;
while (cur) {
tmp = cur->next; //暂存cur的下一个节点
cur->next = pre; //翻转相邻的两个节点
//更新pre和cur指针
pre = cur;
cur = tmp;
}
return pre; //返回反转后的头节点
}
};
- 时间复杂度 --- 遍历一遍链表,其中n为链表长度
- 空间复杂度 --- 没有额外的辅助空间
总结
- 双指针法是从前往后翻转,在不考虑空间复杂度的情况下,可以用递归的方式从后往前翻转。