问题重述:给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。
前提:假设链表一定存在,并且该节点一定不是尾节点。
思路:
No1:
正常的思路是利用该节点前驱节点的指针,将该节点的前驱节点的next指向当前节点的后继,如果前驱节点的指针为 *p,则接下来的操作为: p -> next = p -> next ->next;
No2:
或者利用两个指针:*p 前驱结点的指针 *q 当前节点的指针
通过:p -> next = q -> next
与思路一基本类似
No3:
本题的要求与上述两种方法不太相符,首先只给了当前节点的一个指针,要是通过遍历找到它的前驱节点需要的时间复杂度为O(n),本题要求时间复杂度为O(1).所以就不能使用前驱节点,此时就要换一种思路。题中说该节点一定不是尾节点,所以当前节点的后驱节点一定不为空。所以就考虑用当前节点的后驱节点覆盖当前节点,然后删除原来的后驱节点。
操作:当前节点的指针 *p
p -> val = p -> next -> val;
p -> next = p -> next -> next;
具体代码:
/**
* 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;
}
};