在O(1)时间内删除链表节点
from acwing 28
Time limit:1s
Memory limit:64MB
Problem Description
给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。
假设链表一定存在,并且该节点一定不是尾节点。
Sample:
输入:链表 1->4->6->8
删掉节点:第2个节点即6(头节点为第0个节点)
输出:新链表 1->4->8
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
}
};
这个题目是一个很简单的题目,但是需要想到一个思维。
对于删除指定节点的问题,初学链表过后我们的思维可能是将该节点的上一个节点直接指向该节点的下一个节点。
如图:
如果要删除节点02,那么可能首先想到的是如图中虚线所示,将01指向03。
但是对于这个题目,没有头节点,并且是单向非循环链表,我们是无法得到上一节点的,所以,我们不能删除当前节点,而要删除下一节点。
将03节点的值赋值给02:
node->val = node->next->val; //node表示当前节点
再删除03,这里就和我们前面讲到的思路一样了,我们已知03节点的上一节点02
node->next = node->next->next; //node表示当前节点
解释:
原来:01 -> 02 -> 03
操作1:01 -> 03 -> 03
操作2:01 -> 03
ac代码只需要将以上两个操作连在一起就可以了
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};