206. 反转链表

题目

206. 反转链表 - 力扣(LeetCode)
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

思路

  1. 解读题目:对于每一个节点,将其指针 由指向下一个节点 改为指向上一个节点
  2. 首先,需要一个指针 current,指向正在更改方向的节点
  3. 由于链表是单行道,根据 current 无法找到其上一个节点,因此需要设置另一个指针 previous,标记 current 的上一个节点。
  4. 此时,可以将 current 指向 previous,完成反转。
  5. 但此节点反转后,根据 current. next 无法找到 原来的下一个节点了,链表断裂。
  6. 为防止出现链表断裂,在进行反转 (即第四步) 前,就需要设置一个指针,标记原链表的 current. next。
  7. 由此,可沿原链表继续遍历,依次反转。
    在这里插入图片描述

要点

  • 方法:三指针法
    • 三个指针分别指向:当前操作节点 (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  # 返回反转后的新头节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值