1.题目描述
2.思路解析
①:定义一个变量cur来代替head 遍历链表,以保证head 永远指向头节点
②:当cur.next.val == val ? cur = cur.next.next : cur = cur.next
也就是当 当前节点的下一个节点的值等于 要删除的值val,让当前节点指向下下个节点
得到如下大概代码:
while循环中的条件只要自己模拟几遍即可得到
while (cur.next != null) {
if (cur.next.val == val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
3.边界细节处理
考虑几种特殊情况
①:当 head 节点的值等于 目标值 val 的时候需要处理head 节点
②:当从head 节点开始后续连续节点都等于目标值,则需要重复 步骤①
得到如下代码
因为这里是在处理head 节点,如果head节点等于 目标值的话也是要删除并且移动head节点的,所以这里可以直接使用 head 节点来处理
while (head.val == val) {
if (head.next != null) {
head = head.next;
}else{
return null;
}
}
4.综合上述所得最终代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head == null) {
return head;
}
while (head.val == val) {
if (head.next != null) {
head = head.next;
}else{
return null;
}
}
ListNode cur = head;
while (cur.next != null) {
if (cur.next.val == val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
}
}