剑指 Offer 24. 反转链表

82 阅读1分钟

题目描述:

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

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制: 0 <= 节点个数 <= 5000

解题思路1: 三指针法

  1. 定义3个辅助指针. cur 表示当前需要反转的节点, pre表示 cur 的前一个节点. 进行遍历链表
  2. 先定义临时指针temp 记录cur.next
  3. 将cur 的next 设置为 pre, 进行反转
  4. 将pre赋值为当前cur
  5. 将cur 赋值为反转前的cur.next, 也就是之前记录的temp (不能直接赋值为cur.next, 因为已经反转过了) 时间复杂度: O(n)

示例代码1:

def reverseList(head: helper.ListNode):
    pre, cur = None, head # 步骤1

    while cur:
        temp = cur.next # 步骤2
        cur.next = pre # 步骤3
        pre = cur  # 步骤4
        cur = temp # 步骤5
    return pre

解题思路2: 递归法

  1. 传入2个指针. cur 表示当前节点, pre表示当前节点的前一个节点, 进行递归
  2. 如果当前节点cur不为空, 就返回他的前几点递归回去
  3. 拿到递归的前节点后, 进行反转操作 时间复杂度: O(n)

示例代码2 :

def reverseList(head: helper.ListNode):
    def recursion(cur, pre):  # 步骤1
        if not cur: # 步骤2
            return pre 
        res = recursion(cur.next, cur) # 步骤3
        cur.next = pre
        return res

    return recursion(head, None)