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)
-空间复杂度: