237.删除链表中的节点

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」。

题目

请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。

题目数据保证需要删除的节点 不是末尾节点 。

image.png

输入:head = [4,5,1,9], node = 5

输出:[4,1,9]

解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9

image.png

输入:head = [4,5,1,9], node = 1

输出:[4,5,9]

解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9

思路分析

一般我们删除节点的操作是:

  1. 将待删除节点的上一个节点的next指向待删除节点的下一个节点
  2. 释放待删除节点

然而本题只告诉我们要删除的节点,但不要告诉我们待删除节点的上一个节点,所以我们没有办法用常规办法删除节点。

不过根据一向的谜底在谜面上的原则,我们需要注意这个题眼:题目数据保证需要删除的节点 不是末尾节点 。
普通节点和末尾节点的区别就是只有末尾节点没有下一个节点,不过其实末尾节点的删除反而简单,因为我们可以直接释放改node。

看起来需要我们对末尾节点做些什么,由于我们需要一个待删除节点具有上一个节点的值,因此我们可以将待删除节点和他下一个节点进行交换,这样就可以删除该节点了,具体的做法是:

ListNode nodeNext = node.next;
node.val = nodeNext.val;
node.next = nodeNext.next;
复制代码

总结

本题难度并不大,但是需要及时根据题眼想到解题思路,由于没有任何算法类知识点(或者说没有任何算法模板可以直接套用,因此反而会造成一定的麻烦。)