题目
206. 反转链表 - 力扣(LeetCode)
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
思路
- 解读题目:对于每一个节点,将其指针 由指向下一个节点 改为指向上一个节点
- 首先,需要一个指针 current,指向正在更改方向的节点
- 由于链表是单行道,根据 current 无法找到其上一个节点,因此需要设置另一个指针 previous,标记 current 的上一个节点。
- 此时,可以将 current 指向 previous,完成反转。
- 但此节点反转后,根据 current. next 无法找到 原来的下一个节点了,链表断裂。
- 为防止出现链表断裂,在进行反转 (即第四步) 前,就需要设置一个指针,标记原链表的 current. next。
- 由此,可沿原链表继续遍历,依次反转。
要点
- 方法:三指针法
- 三个指针分别指向:当前操作节点 (
cur
)、当前节点的上一个节点 (cur_pre
)、当前节点的下一个节点 (cur_nex
) - 设置
cur_pre
目的:链表是单行道,不标记就回不去了 - 设置
cur_nex
目的:反转后链表断裂,cur
可跳转至cur_next
继续遍历
- 三个指针分别指向:当前操作节点 (
- 注意:
- 当完成一个节点的反转,进行下一个节点时,注意三个指针的更新顺序。
- 始终注意一次循环结束后,指针到底停在了哪里,防止循环条件出错。
代码
class Solution(object):
def reverseList(self, head):
"""
:type head: Optional[ListNode]
:rtype: Optional[ListNode]
"""
if not head: # 如果链表为空,直接返回
return None
cur_pre = None # 反转后链表的初始前置节点为 None
cur = head # 当前节点
cur_nex = None # 临时变量存储下一个节点
while cur: # 遍历整个链表
cur_nex = cur.next # 保存当前节点的下一个节点
cur.next = cur_pre # 反转指针
cur_pre = cur # 更新前置节点
cur = cur_nex # 移动到下一个节点
return cur_pre # 返回反转后的新头节点