【算法系列-链表】移除链表元素
欢迎来到【算法系列】第二弹 🏆 链表,接下来我们将围绕链表这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨
文章目录
- 【算法系列-链表】移除链表元素
- 1. 算法分析🛸
- 2. 在原链表上删除
- 2.1 思路分析🎯
- 2.2 解题过程🎬
- 2.3 代码示例🌰
- 3. 使用虚拟头节点删除
- 3.1 思路分析🎯
- 3.2 解题过程🎬
- 3.3 代码示例🌰
1. 算法分析🛸
对于链表类的算法题,一般题目都会给我们默认提供好了链表节点 ListNode,不过在真实场景下若我们需要进行手撕算法题时也需要自己写出这个ListNode,这里我就先给帖出来了(这里提供的是Java版本):
public class ListNode {
int val;
ListNode next;
public ListNode() {};
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
【题目链接】:LeetCode 203 移除链表元素
对于上述这道题,我们需要删除符合目标值的节点,根据处理逻辑我提供了两者方案:
- 在原链表上删除
- 使用虚拟头节点删除
而二者的主要区别就在于:对头节点的处理方案
2. 在原链表上删除
2.1 思路分析🎯
通过画图分析很清晰就能得出解决方案:
由图解可知,只需要让当前节点cur指向当前节点的下一个节点的下一个节点即可删除节点
2.2 解题过程🎬
定义一个节点cur让其指向头节点,后续的每次遍历使用cur即可,head不变后面用来返回结果,这里有一个地方需要注意,那就是头节点的值如果也是目标值的话,我们也需要删除这个节点,删除方式就是让头节点指向头节点的下一个节点,即 head = head.next,这里可以通过循环进行删除;
之后进入新的循环,当 cur != null && cur.next != null 时,进行判断: 若cur.next.val 不等于目标值,则让cur指向下一个节点,即 cur = cur.next; 若 cur.next.val 等于目标值,则让cur.next = cur.next.next 即可完成删除,注意这里不用让cur = cur.next,因为你不确定此时的cur.next 是否也等于目标值,一旦让 cur 往下走在单链表中此时的cur将无法删除; 直到循环结束,返回头节点即可
2.3 代码示例🌰
class Solution {
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
head = head.next;
}
ListNode cur = head;
while (cur != null && cur.next != null) {
if (cur.next.val == val) {
cur.next = cur.next.next;
continue;
}
cur = cur.next;
}
return head;
}
}
3. 使用虚拟头节点删除
3.1 思路分析🎯
这道题的解决思路与在原始链表上删除节点不同,在原始链表上删除节点我们需要考虑到头节点与普通节点的删除方式是不同的,而这里使用虚拟头节点来删除节点则可以将删除方式都统一化
从图解中可以看到,这里我们删除头节点不需要循环遍历 head = head.next,而是让cur指向虚拟头节点,统一使用 cur.next = cur.next.next即可
3.2 解题过程🎬
定义一个虚拟头节点 vhead,并让vhead的下一个节点指向头节点head, 并定义节点cur 指向该节点,后续的每次遍历使用cur即可;
之后进入新的循环,当 cur != null && cur.next != null 时,进行判断: 若cur.next.val 不等于目标值,则让cur指向下一个节点,即 cur = cur.next; 若 cur.next.val 等于目标值,则让cur.next = cur.next.next 即可完成删除,注意这里不用让cur = cur.next,因为你不确定此时的cur.next 是否也等于目标值,一旦让 cur 往下走在单链表中此时的cur将无法删除; 直到循环结束,返回 vhead.next 即可
3.3 代码示例🌰
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode vhead = new ListNode();
vhead.next = head;
ListNode cur = vhead;
while (cur != null && cur.next != null) {
if (cur.next.val == val) {
cur.next = cur.next.next;
continue;
}
cur = cur.next;
}
return vhead.next;
}
}
以上便是对移除链表元素类型题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨