题解 | #删除链表的节点#为什么必须检查头节点的原因

删除链表的节点

https://www.nowcoder.com/practice/f9f78ca89ad643c99701a7142bd59f5d

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`,实际上并没有删除头节点。

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

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

全部评论

相关推荐

小时候觉得老师是很伟大的职业 感觉老师都是人中龙凤才能当 后来考入大学 发现以前的老同学也是公费师范生了 他们什么样什么人品 我还不清楚吗 只能希望他们以后也会有改变 要不纯属耽误孩子 实习之后发现 有的领导 能当上领导也可能运气成分很多 自己决策方面很差 分配给属下的东西自己也说不明白  前些年那些明星 各种塌房 少林寺大师都能有情人和孩子 越长大越发现世界就是个草台班子 以前对不懂的东西有一层羡慕的滤镜 接触之后发现就不是那回事了
RazerYang:其实也是幸存者偏差,你只关注草台班子的部分,所以觉得世界都是草台班子。实际上你每天能安全地从床上醒来,有稳定的天然气、自来水和电力供应,能让你吃上热乎的饭菜,能收到持续稳定的信号去刷手机,花几块钱就能坐地铁从城市的一端快速移动到另一端,花几百块就能在一天之内安全穿越整个国家,这都不是一个草台班子能实现的。燃气、水利、电力、通信、公交、民航,还有最重要的公安和国防,这些都不是草台班子能做的,有无数普通人构筑了你生活的方方面面,而你也将加入他们。
我对___祛魅了
点赞 评论 收藏
分享
07-07 17:06
已编辑
深圳技术大学 golang
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务