学习笔记

51 阅读4分钟

题目解析:反转链表

  • 题目:给定一个单链表的头节点 head,反转该链表,并返回反转后的链表头节点。例如,输入链表 1 -> 2 -> 3 -> 4 -> 5,输出应为 5 -> 4 -> 3 -> 2 -> 1

  • 思路

    • 可以使用迭代的方法。定义三个指针:prev 初始化为 None,表示反转后链表的前一个节点;curr 初始化为 head,即当前要处理的节点;next 用于临时保存当前节点的下一个节点。
    • 遍历链表,在每次迭代中,先将 curr 的下一个节点保存到 next,然后将 curr 的下一个节点指向 prev,接着更新 prev 为 currcurr 为 next,如此循环直到 curr 为 None,此时 prev 就是反转后的链表头节点。
  • 代码详解

收起

python

复制

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseList(head):
    prev = None
    curr = head
    while curr:
        # 保存当前节点的下一个节点
        next = curr.next
        # 反转指针
        curr.next = prev
        # 更新 prev 和 curr
        prev = curr
        curr = next
    return prev

首先定义了链表节点类 ListNode。在 reverseList 函数中,按照上述思路,通过循环逐步反转链表指针,最后返回反转后的头节点 prev

知识总结:

  • 新知识点

    • 链表指针操作。理解如何通过改变节点间的指针方向来实现链表的反转,掌握指针的灵活运用。
    • 迭代思想在链表操作中的应用。利用循环和指针移动来处理链表中的每个节点,实现特定功能。
  • 理解

    • 链表的反转本质上是对链表结构的重新构建,通过巧妙地操作指针,打破原有的节点连接顺序并建立新的顺序。迭代的方式能够高效地遍历链表并逐个修改指针,避免了复杂的递归调用栈。
  • 学习建议

    • 对于初学者,先熟悉链表的基本结构和节点的构成。可以手动绘制链表结构图,模拟指针的变化过程,加深对指针操作的直观感受。
    • 学习代码时,重点关注三个指针在循环中的变化规律和作用,理解为什么这样的指针操作能够实现链表反转。
    • 尝试修改代码,如在反转过程中添加对链表节点值的修改或统计操作,进一步巩固对链表操作的掌握。

学习计划:

  • 制定刷题计划

    • 以数据结构为主题划分阶段,如先安排一周专门攻克链表相关题目。每天抽出 1 - 2 小时,前半小时复习前一天的链表知识和错题,后 1 - 1.5 小时做新的链表题目,从简单的链表创建、遍历开始,逐步过渡到复杂的链表操作如反转、合并等。
    • 完成链表阶段后,总结归纳链表的各种操作方法和常见解题思路,再进入下一个数据结构的学习阶段,如二叉树等。
  • 利用错题进行针对性学习

    • 当出现错题时,仔细分析错误原因。若是对链表指针操作理解错误,重新回顾链表节点的指针结构和基本指针操作规则,可结合画图辅助理解。
    • 如果是循环条件或逻辑错误,对比正确代码,理清错误逻辑所在,在纸上详细写下正确的逻辑流程。
    • 将错题整理成文档,记录错误题目、错误答案、正确答案以及错误分析和相关知识点总结,定期回顾,重新解答错题,检验自己是否真正掌握。

工具运用:

  • 与在线编程社区结合

    • 在刷题过程中遇到困难或有疑问时,到编程社区如 Stack Overflow 上搜索相关问题。例如,对于链表反转中指针操作的疑惑,可以在社区中查找类似问题的讨论和解决方案,借鉴他人的思路和代码示例。
    • 自己解决了一道较难的链表题目后,也可以在社区分享自己的解题思路和代码,接受他人的评价和建议,进一步提升自己的编程水平。
  • 与编程学习 APP 配合

    • 利用一些编程学习 APP,如 LeetCode 等,在手机上随时随地查看链表相关的知识点总结和题目分类。在公交、地铁等碎片化时间里,可以复习链表的基本概念和常见解题模式,与 MarsCode AI 刷题形成互补,提高学习效率。