剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

❤双指针

思路

24- ★反转链表(了解递归方法!) - 图1

算法

实现

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. ListNode* cur = NULL, *pre = head;
  5. while (pre != NULL) {
  6. ListNode* t = pre->next;
  7. pre->next = cur;
  8. cur = pre;
  9. pre = t;
  10. }
  11. return cur;
  12. }
  13. };

复杂度分析

  • 时间复杂度:24- ★反转链表(了解递归方法!) - 图2
  • 空间复杂度:24- ★反转链表(了解递归方法!) - 图3

❤❤递归

思路

  • 一直递归到链表的最后一个节点,该节点就是反转后的头结点,记作ret。
  • 此后,在返回时 ,让当前节点的下一节点指向当前节点,同时让当前节点的next指向NULL,从而实现翻转。
  • 当递归函数全部出栈后,链表翻转完成。

24- ★反转链表(了解递归方法!) - 图4

实现

  1. //骚操作递归!
  2. ListNode* reverseList(ListNode* head) {
  3. if (head == NULL || head->next == NULL) {
  4. return head;
  5. }
  6. ListNode* ret = reverseList(head->next);
  7. head->next->next = head;
  8. head->next = NULL;
  9. return ret;
  10. }
  11. //正规操作递归
  12. class Solution {
  13. public:
  14. ListNode* reverseList(ListNode* head) {
  15. if(head==NULL) return head;
  16. dfs(head,head->next);
  17. return ans;
  18. }
  19. private:
  20. ListNode* ans=NULL;
  21. void dfs(ListNode* pre ,ListNode* cur){
  22. if(cur==NULL){
  23. ans=pre;
  24. return;
  25. }
  26. dfs(pre->next,cur->next);
  27. cur->next=pre;
  28. pre->next=NULL;
  29. }
  30. };

复杂度分析

  • 时间复杂度:24- ★反转链表(了解递归方法!) - 图5
  • 空间复杂度:24- ★反转链表(了解递归方法!) - 图6

题目标题难度划分

星级 题目难度
简单
☆☆ 中等
☆☆☆ 困难

算法掌握难度程度划分

星级 掌握难度
普通
经典,易掌握
❤❤ 经典,略难掌握
❤❤❤ 困难