文章目录
前言
LeetCode第203道题目-移除链表元素,主要考察链表相关知识
题目链接:203. 移除链表元素
一、题目描述
题目描述中左边已经给出了示例,右边给出了ListNode的模板以及我们要提交的Solution类的模板;
注意:我们需要用到提供的ListNode类来完成Solution类的实现,但最终提交代码的时候只需要提交Solution类即可。
二、解题思路
1.不通过虚拟头节点来解决问题
我们需要分两步来打开解题思路:第一步,我们首先单独处理头节点的逻辑,第二步我们单独处理除了头节点以外节点的逻辑;(具体逻辑见下面的代码)
注意一点就是:题目中说明我们需要删除和给定元素的所有相同的链表元素,可能会有多个,所以我们要通过while循环去处理问题;
(prev:代表当前节点的前一个节点)
代码如下:
/**
* @Description 不通过虚拟头节点来处理链表问题
* @Author Follow Wind
* @Date 2021/1/7 9:21
*/
public class Solution {
public ListNode removeElements(ListNode head, int val) {
//1. 首先处理头节点逻辑
while (head != null && head.val == val) {
ListNode retNode = head;
head = head.next;
retNode.next = null;
}
// 如果此链表中所有的元素都和要删除的元素相同,那么经过第一步的操作,最后剩下的head就为null
if (head == null)
return null;
//2. 然后再处理除头节点以外的逻辑
ListNode prev = head;
while (prev.next != null) {
if (prev.next.val == val) {
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
} else {
prev = prev.next;
}
}
return head;
}
}
2.通过虚拟头节点来解决问题
设置一个虚拟头节点,名为dummyHead,那么我们就不需要单独的去处理头节点的逻辑,我们用除头节点外的那一套逻辑就可以处理整个链表的问题;
代码如下:
/**
* @Description 通过头节点处理问题
* @Author Follow Wind
* @Date 2021/1/7 9:42
*/
public class Solution {
public ListNode removeElements(ListNode head, int val) {
// 申明一个头节点(这里的-1只是一个随便的数字,大家也可以随便取,只要是int类型即可)
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode prev = dummyHead;
while (prev.next != null) {
if (prev.next.val == val) {
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
} else {
prev = prev.next;
}
}
//注意:最后返回的是dummyHead.next而不是head
return dummyHead.next;
}
}
总结
此道题目主要考察了链表的基本知识,对于学习数据结构中链表有很大的帮助,有任何问题,评论区交流,共同进步!