[剑指 Offer 24. 反转链表] | 刷题打卡

185 阅读1分钟

今天我们来做一道LeetCode上的题目,原题链接:剑指 Offer 24. 反转链表

题目描述

  • 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
  • 示例:
    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
  • 限制:
    0 <= 节点个数 <= 5000

思路分析

  • 利用外部数组逆序后重新生成新链表
  • 双指针遍历
  • 递归解法
    • 终止条件是当前节点或者下一个节点==None
    • 在函数内部,改变节点的指向,也就是head的下一个节点指向head递归函数那句head.next.next = head,其实就是head的下一个节点指向head,eg:当前head为4,head.next为5,head.next.next为None,由于None递归返回,故head.next.next为head

代码

# Python
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        # # 1.利用外部数组
        # r_list = []
        # while head:
        #     r_list.append(head.val)
        #     head = head.next
        # r_head = cur = ListNode(0)
        # for r in r_list[::-1]:
        #     cur.next = ListNode(r)
        #     cur = cur.next
        # return r_head.next

        # # 2.双指针迭代
        # r_head = None
        # while head:
        #     tmp = head.next
        #     head.next = r_head
        #     r_head = head
        #     head = tmp
        # return r_head

        # 3.递归解法
        if not head or not head.next:
            return head
        cur = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return cur

总结

  • 利用外部队列最简单直接,性能最差
  • 双指针始终
  • 迭代方法性能最佳,但是逻辑最难

附录

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情