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