「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
前言
今天我们来做两道关于删除链表节点的题目,分别是:
237. 删除链表中的节点、
剑指 Offer 18. 删除链表的节点
这两题是运用了两种删除链表节点的方法。
题目描述
237. 删除链表中的节点
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。
题目数据保证需要删除的节点不是末尾节点 。
解题思路
这题我们需要注意的有两点:
- 我们无法访问链表的头节点,所以无法从头节点开始遍历找到要删除节点的前一个节点,那么,前一个节点指向待删除节点的后一个节点的这种删除方法用不了了
- 我们注意到题目中提到
“题目数据保证需要删除的节点不是末尾节点”,就是说我们待删除的节点后面至少还有一个节点,此时,我们想到可以将待删除节点改造成它的下一个节点,它连接下下个节点不就达到我们的目的了吗
开始解题
var deleteNode = function(node) {
node.val = node.next.val; // 复刻待删除节点的下个节点的值
node.next = node.next.next; // 复刻待删除节点的下个节点的指向
};
剑指 Offer 18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
解题思路
本题是给了我们链表的头结点和要删除节点的值,没有直接给要删除的节点,但是有值,而且题目中说明了所给链表节点的值是不重复的,所以我们只要从头结点开始查找,找到要删除节点的前一个节点即可,需要注意的一点是要删除的节点可能是头结点,那么我们本题需要设置虚拟头
开始解题
var deleteNode = function(head, val) {
if(!head) return null;
let hair = new ListNode(-1,head), pre = hair; // 设置虚拟头
while(pre) {
let temp = pre; // 保存一下pre,如果pre.next是我们要删除的节点,直接有temp连接下个节点即可
pre = pre.next;
if(pre.val === val) {
temp.next = pre.next;
return hair.next;
}
}
};