程序员老鬼

逆天,妹子加班到深夜导致视网膜脱落,住院期间仍坚持code review。。。

妹子加班加到视网膜脱落,住院输液间隙还不忘拉个 code review,安排任务。这精神状态……我上次见到还是《攻壳机动队》里。

Image

她的健康可能掉线了,但业务需求没掉线;她的视网膜告急了,但眼里依旧只有 Jira 看板。组里换了好几拨人,她就像系统服务里那个“常驻后台且不能杀”的进程,永远稳定运行。

不过说真的,大家别学,真别学。这不是拼命三郎,这是加班精卫。公司可能“感动”,但感动完还是会把你名字加进周报,然后继续招新人接盘。健康这事,commit 一次少一次,建议定期 merge 休息时间。你可以没有绩效,但不能没有视力!【备注:文末可领最新资料】

算法题:删除链表的倒数第 N 个结点

局长 

删除链表的倒数第 N 个结点这个问题,在面试中真的是“老朋友”了,几乎所有数据结构的岗位都绕不过去。它看似简单,但却很考验对链表的基本功理解,特别是对指针移动的控制。

假设我们有一个单链表,要删除倒数第 N 个节点。注意是“倒数”,这意味着我们需要从链表尾部向前数第 N 个,但链表不能反向遍历,这个设定就是考点所在。如果你第一反应是“遍历一遍记录总长度,然后第二遍走到 length - n 就好了”,这当然是正确的,不过效率不高,要遍历两次。

更高效的方法是使用双指针技巧,也就是快慢指针,让两个指针拉开 N 的距离,然后一起走。当快指针到链表末尾,慢指针就恰好停在要删除节点的前一个位置。

不过为了避免头节点被删时出现特殊情况,我们通常加一个 dummy 节点,它的 next 指向 head。这样可以统一处理逻辑,不用担心“头节点也可能被删”这个边界问题。

下面是这个方法的 Java 实现:

publicclassListNode {
int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

publicclassSolution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 虚拟头节点,简化边界处理
ListNodedummy=newListNode(0);
        dummy.next = head;
ListNodefast= dummy;
ListNodeslow= dummy;

// 快指针先走 n+1 步
for (inti=0; i <= n; i++) {
if (fast != null) {
                fast = fast.next;
            }
        }

// 快慢指针一起移动,直到快指针到底
while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }

// 删除目标节点
if (slow.next != null) {
            slow.next = slow.next.next;
        }

return dummy.next;
    }
}

这个解法只需要遍历一趟链表,时间复杂度是 O(n),空间复杂度是 O(1),也就是最优解法。而且在编码上,通过 dummy 节点,把头节点被删除的情况也统一处理了,逻辑非常清晰。唯一要注意的是 for 循环走的是 n+1 步,不是 n 步。这样 slow 停在目标节点的前一个节点上,才能方便执行删除操作。

有人在使用这个方法时容易卡在边界,比如 n 的值刚好等于链表长度,这时被删的是头节点,如果没用 dummy 节点,可能会因为 null.next 报错。还有些人会写漏判断 null 的地方,导致 NPE,这些都要小心。

整体来看,这道题虽小,但涉及到了链表的基本技巧、边界处理和代码健壮性。能写得顺、写得稳,就是对链表掌握的体现。如果你在工作中经常处理链表、树这种需要精细指针控制的结构,这个题目绝对是值得练熟的。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学可以链接我,微信:hls404 找我领取。

以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。