这个题难度并不是很大,主要考察了对链表数据结构的灵活使用能力,有点脑筋急转弯的意思。
题目要点:
删除一条单链表的中间结点(不是第一个或者最后一个),参数只传递了被删除的结点的指针。
打眼一看其实是有点懵的,因为平常的删除都需要知道被删结点的前一个结点,这样才能将前一个结点之间连接到被删的下一个结点,这里无法获取被删结点的前面所有结点,因而我们的常规思路是无法进行。
但想来想去,删除链表只有这一种思路,在这种思路下我们只能删除后面的结点,等等!可以删除后面的结点…emmmmm…我懂了,我们直接采用“替罪羊删除法”,既然我不能灭了你,就彻彻底底把你“同化”:即保留被删结点,但将其值修改为它下一个结点的值,同时再删除下一个结点。
算法如下:
/**
* 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) {
ListNode * p = node->next;
node->val = p->val;
node->next = p->next;
delete p;
p = NULL;
}
};