题目描述

image.png
相同题目,在专题反转链表中有记录。🔗

迭代法

解题思路
如下图所示,题目要求将链表反转。本文介绍迭代(双指针)、递归两种实现方法。
考虑遍历链表,并在访问各节点时修改 next 引用指向,算法流程见注释。
复杂度分析
时间复杂度 O(N) : 遍历链表使用线性大小时间。
空间复杂度 O(1) : 变量 pre 和 cur 使用常数大小额外空间。

  1. /**
  2. * 简化方法(暂存后继节点)
  3. *
  4. * @param head
  5. * @return
  6. */
  7. public ListNode reverseList(ListNode head) {
  8. ListNode cur = head, pre = null;
  9. while (cur != null) {
  10. ListNode temp = cur.next; // 暂时保存后面一个节点
  11. cur.next = pre; // 交换指向
  12. pre = cur;
  13. cur = temp;
  14. }
  15. return head;
  16. }

递归法

  1. /**
  2. * 递归法
  3. *
  4. * @param head
  5. * @return
  6. */
  7. public ListNode reverseList(ListNode head) {
  8. return recur(null, head.next);
  9. }
  10. public ListNode recur(ListNode pre, ListNode cur) {
  11. if (cur == null) return pre; // 递归的中止条件
  12. ListNode temp = cur.next; // 保存下一个节点
  13. cur.next = pre; // 转换指针指向
  14. return recur(cur, temp); // 递归转换
  15. }