import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param val int整型 
     * @return ListNode类
     */
    public ListNode deleteNode (ListNode head, int val) {
        // write code here
        ListNode p=head;
        if(head.val==val){
            head=head.next;
        }
        else{
  		while(p.next.val!=val){
			  p=p.next;
		  }
		  p.next=p.next.next;
		  }
        return head;

    }
}

如果直接使用 `p = p.next;` 而不对头节点进行特殊处理,那么会有一些情况下代码不能正常工作。

如果头节点就是需要删除的节点,那么不进行检查直接移动 `p` 指向头节点的下一个节点,并不会实际上从链表中移除头节点,因为链表的外部引用仍然指向原来的头节点。

举个例子,如果链表是 `1 -> 2 -> 3` ,并且想要删除值为 `1` 的节点,如果不检查并处理头节点,而是简单地使用 `p = p.next;`,那么 `p` 将指向节点 `2`,但是外部对链表的引用仍然指向节点 `1`,这意味着链表看起来仍然是 `1 -> 2 -> 3`,实际上并没有删除头节点。

为了确保链表正确更新,您必须单独检查头节点,并且如果头节点需要被删除,更新头节点的引用以指向原来头节点的下一个节点。在链表的上下文中,“头节点”通常是指链表的第一个节点,它是链表的入口点。如果不更新这个引用,那么头节点就永远不会被删除,因为链表的外部引用(通常是函数外部的变量或者链表自身的数据结构中的一个字段)指向的仍然是原来的节点。

因此,需要特殊处理头节点,以确保当头节点是要删除的节点时,链表的外部引用更新为指向新的头节点。