前端算法小白攻略33-leetcode(删除链表的节点)

124 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

前言

今天我们来做两道关于删除链表节点的题目,分别是:
237. 删除链表中的节点
剑指 Offer 18. 删除链表的节点
这两题是运用了两种删除链表节点的方法。

题目描述

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

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

解题思路

这题我们需要注意的有两点:

  1. 我们无法访问链表的头节点,所以无法从头节点开始遍历找到要删除节点的前一个节点,那么,前一个节点指向待删除节点的后一个节点的这种删除方法用不了了
  2. 我们注意到题目中提到“题目数据保证需要删除的节点不是末尾节点”,就是说我们待删除的节点后面至少还有一个节点,此时,我们想到可以将待删除节点改造成它的下一个节点,它连接下下个节点不就达到我们的目的了吗

开始解题

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; 
        }
    }
};