[路飞]_每天刷leetcode_58( 删除中间节点 Delete Middle Node)

294 阅读2分钟

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

删除中间节点 Delete Middle Node

LeetCode传送门面试题 02.03. 删除中间节点

题目

若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。

假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。

Implement an algorithm to delete a node in the middle (i.e., any node but the first and last node, not necessarily the exact middle) of a singly linked list, given only access to that node.

例如,传入节点 c(位于单向链表a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f

Example:

Input: the node c from the linked list a->b->c->d->e->f
Output: nothing is returned, but the new linked list looks like a->b->d->e->f


思考线


解题思路

我们看到这个题目,我的第一个想法是,重头遍历链表,然后找到和删除链表相同的元素,然后让它上一个元素指向删除元素的下一个位置。这样就可以用时间复杂度为O(n)的复杂度来解决这道题。

但是我们 再看一下解题中给的条件

/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function (node) {
};

题目中只给了一个待删除的元素,没有给出原始的链表,这要怎么来做呢?

我们分析一下这道题,如果在没有给出原始链表的情况下可以实现删除给定的节点的话,我们要保证能让当前节点指向下一个节点。

所以问题从如何删除中间节点变为如何让待删除节点变为下一个节点。

我们分析一下在单向链表中我们有什么。 链表中有两个属性,val为链表的值,next为链表指向的下一个内容。

如果我们把待删除元素的val改成下一个节点的值。同时将待删除元素的next指针指向下下个元素,即this.next = this.next.next这样我们就完美的把需要删除的节点替换为下一个节点。也就完成了删除中间节点的需求。

具体代码实现如下:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function (node) {
    node.val = node.next.val;
    node.next = node.next.next;
};

时间复杂度分析

O(1): 我们的操作是常数级别的。

这就是我对本题的解法,如果有疑问或者更好的解答方式,欢迎留言互动。