第一眼看到这道题会眼前一亮,因为单链表链表的删除操作从来都是O(n)的。鉴于没有给定头结点所以不可能的到该节点的前驱,而题目又保证一定不是尾结点。这无不给我们暗示,不借助前驱意味着不能将前驱结点的next指针改变,所以想到是否可以用后面的结点来覆盖当前要删除的结点。想到这里O(1)的思路就来,将该节点的next结点的val赋给当前结点,并将当前节点node的next指针指向 node->next->next,同时删除node->next,就可以a掉这道题了QAQ...
/**
* 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;
ListNode *p = node->next->next;
free(node->next);
node->next = p;
}
};