Leetcode 203:移除链表元素

题目链接:https://leetcode.cn/problems/remove-linked-list-elements/

建议:本题最关键的要理解虚拟头节点的使用技巧,以及为什么要使用虚拟头节点

解题思路: 终于进入链表数据结构的刷题了,与之前数组不同的是,链表中的内存不是连续分布的。所以对于链表的剔除元素操作要比数组更加简单直接,但是我们需要思考的是如果我们需要删除的元素是head指向的元素,那我们该当如何呢?故此时便需要虚拟头节点,其实链表的基本操作如果使用虚拟头节点往往会事半功倍!

在做相关链表题时我们需要注意三个方面:

1:如何自定义链表节点的结构体。(注意结构体的尾括号也有“;”)

 * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     };

2:如何定义空节点指针

  

  //method 1:
    Listnode* node1 = NULL;
     
    //method 2:
    Listnode* node1 = nullptr;

3:确定while循环的跳出条件

往往都是根据当指针指向空节点时,便跳出循环

Leetcode 707:移除链表

题目链接:https://leetcode.cn/problems/design-linked-list/

建议:这是一道链表综合题,对熟悉链表基本操作非常有帮助

解题思路:虚拟头节点至关重要

Leetcode 206:反转链表

题目链接:https://leetcode.cn/problems/reverse-linked-list/

建议:链表的基本操作题,主要使用了双指针法, 同时也包含了虚拟头节点

解题思路:设置pre,cur两个节点,pre是虚拟头节点,cur指向头节点,每次当cur和pre位置确定时,便进行 cur->next = pre 的操作,完成了局部翻转,这时再将pre和cur都向后依次移动一位,但是我们必须再初始一个链表指针temp,用来提前记录cur下一步需要移动的位置cur->next,否则当执行完翻转操作后,我们便找不到真正的cur->next的位置了;