206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路: 此题虽然简单,但是是面试中常见的手撕代码题,而且关于链表的题,会涉及到指针,内存管理等等,面试官可以通过链表题牵引出内存管理、指针的知识,因此链表的题建议重点准备。此题题意要求提供两种解法,即迭代和递归,摘取代码注释中的题解。
提供迭代和递归两种方法:
- 迭代,附设一个前项节点pre,初始状态位NULL,然后遍历过程中将当前节点cur的next指向pre,然后cur指向下一个节点,pre移动cur节点。
- 递归,将head->next链表倒置,然后head->next恰好指向的是倒置链表的尾结点,将原链表头节点head移动到尾部完成头结点倒置,然后返回新的头结点。
// 提供迭代和递归两种方法:
// 1. 迭代,附设一个前项节点pre,初始状态位NULL,然后遍历过程中
// 将当前节点cur的next指向pre,然后cur指向下一个节点,pre移动cur节点
// Time: O(n),space:(1)
// 2. 递归,将head->next链表倒置,然后head->next恰好指向的是倒置链表的尾结点,
// 将原链表头节点head移动到尾部完成头结点倒置,然后返回新的头结点
// Time: O(n),space:O(n),i.e.,递归栈占辅助空间
class Solution {
public:
ListNode* reverseList(ListNode* head) {
#ifdef ITERATOR
if (!head || !head->next) return head;
ListNode *pre = NULL, *cur = head, *next = NULL;
while (cur) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
#endif
// #ifdef RECURSION
if (!head || !head->next) return head;
ListNode *newNode = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newNode;
// #endif
}
};