题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
来源:力扣(LeetCode)
- 示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
- 限制:
0 <= 节点个数 <= 5000
解题思路
-
设置三个指针
prev
、cur
、nexts
。步骤如下:
prev 负责存取反转指针; cur 为移动的指针; nexts 负责先暂存下一步指针
(a) tmp: 當前指針cur
若有值,先將下一步存到nexts
=> 避免反转后的链表断掉
(b) tmp:先將将cur.next
指向 None,并将cur
赋予给prev
=> prev = cur
=> 反转指针
© 更新cur
:cur = nexts
(d) 需判断head
为空值或是head.next
為空的情形。 -
反转后的头节点,是原始链表的尾节点。
-
注意事项:链表相关问题会有大量的指针操作,先分析、后写代码。设计的时间通常不会比编码的时间短,与其很快写出一段漏洞百出的代码,不然仔细分析在写出Robust的代码。
Python 代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head:
return None
if not head.next:
return head
cur = head
prev = None
nexts = None
while cur:
nexts = cur.next
cur.next = prev
prev = cur
cur = nexts
return prev