Leetcode-链表篇 Day3

57 阅读2分钟

代码随想录算法训练营第三天| 203.移除链表元素、707.设计链表、206.反转链表

  • 203.移除链表元素

题目链接 视频链接

链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点在进行删除操作。本题推荐设置虚拟头结点的方法。

图片.png

  • 707.设计链表

题目链接 视频链接

本题考查链表的五种基本操作,在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

同样,我们设置一个虚拟头结点再进行操作。要注意的地方在于,插入元素的时候顺序很重要,避免节点丢失。

  • 206.反转链表

题目链接 视频链接

本题的关键在于双指针,也可以使用递归的方法。

图片.png

首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为None。

然后开始反转,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。

接下来改变 cur->next 的指向,将cur->next 指向pre,此时已经反转了第一个节点了。

接下来,循环走如下代码逻辑,继续移动pre和cur指针。

最后,cur 指针已经指向了None,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。

总结:要加深对双指针的理解,抓住各种形式变化以及对递归的理解。