今天我们来做一道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 春招闯关活动」, 点击查看 活动详情