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



京公网安备 11010502036488号