题目
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
**进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
解题
方法一:前插法
思路
- 首先,在定义 Solution 类时,reverseList 方法接收一个名为 head 的可选的 ListNode 参数,并且返回一个可选的 ListNode。
- 在方法内部,使用条件判断 if not head or not head.next: 来检查链表是否为空或只有一个节点,如果是,则直接返回该链表,因为无需反转。
- 接着,定义一个当前节点 curr 并初始化为 head,定义一个新的头节点 head 并初始化为 None。
- 进行循环遍历,条件为 while curr: 表示只要当前节点 curr 不为空,就执行循环体内的代码。在每次迭代中,执行以下操作:
- 首先,保存当前节点 curr 的下一个节点为 next_node。
- 然后,将当前节点的 next 指针指向新的头节点 head,将当前节点 curr 成为新的头节点。
- 接着,将当前节点 curr 更新为下一个节点 next_node。
- 重复上述步骤,直到当前节点 curr 为 None,即完成链表反转。
- 最后,返回新的头节点 head。
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
curr = head
head = None
while curr:
next_node = curr.next
curr.next = head
head = curr
curr = next_node
return head