237. 删除链表中的节点

题目

有一个单链表的 head,我们想删除它其中的一个节点 node。

给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。

链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。

删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:

给定节点的值不应该存在于链表中。 链表中的节点数应该减少 1。 node 前面的所有值顺序相同。 node 后面的所有值顺序相同。

示例 1:

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

输出:[4,1,9]

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

难度: 中等

题解

删除链表中的节点的常见方法是定位到待删除的上一个节点,修改上一个节点的next指针,使其指向待删除节点的下一个节点,即可完成删除操作。

本题中,传入的参数node为要被删除的节点,根据题目中无法访问第一个节点head,因此就无法定位到要删除节点的上一个节点。注意到要被删除的节点不是链表的末尾节点,因此node->next不为空。

在给定节点node的情况下,可以通过修改node和node->next的值,将node->next->val赋给node,并删除最后一个节点。

1、将链表中第三个节点的值赋给第二个节点,将第四个节点的值赋个第三个节点,此时链表为

  4->1->9->9

2在保证node下一个节点不为空的情况下删除链表的最后一个节点,此时链表为:

  4->1->9

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
void deleteNode(struct ListNode* node) {
    while(1){
        node->val=node->next->val;
        if(node->next->next==NULL){
            node->next=NULL;
            break;
        }
        node=node->next;
    }
}

 

复杂度分析

-时间复杂度:O(1)

-空间复杂度:O(1)

 

 

 

 

 

 

posted @ 2022-09-27 10:36  一树懒  阅读(88)  评论(0)    收藏  举报