题目:
实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。
示例:
输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f
应考虑到的测试用例:
- 功能测试:如单项链表 [1,2,3,4,5,6,7],输入 3;
- 特殊输入测试: 链表为空;单项链表 [1,2,3,4,5,6,7],输入 6 或 7,即节点为倒数第一二个节点;
- 性能测试:
分析:
如果只能访问当前节点,那么该题的解题思路就是,将自己变成其他节点。
举个例子:A->B->C->D
如果要删掉 B 节点,那么只需要将 B 变为 C,再把 B 的指针指向 D,即可完成。
思路简单明了,简单分析
1、给出的一定是中间结点,即链表长度一定 >=3(一定存在中间结点)
2、因此已知可以删除当前点,最重要的反而不是当前点,而是下一个点的处理方法
3、分类讨论:
- 当所给结点后结点数量 >= 两个的时候,直接下一个结点 val 赋值到所给结点,再将 ->next 指向下下个结点
- 当所给结点后结点数量 = 1,即 (node->next)->next==NULL, 可知当前结点为倒数第二个结点。直接将下一个结点 val 赋值给当前结点,当前结点 ->next 指向 NULL 即可
4、这么做还是因为前结点的地址咱不知道,只能从后面的下手(把前面当做一坨)。
基于以上分析,题解代码如下:
/**
* 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) {
if (!node) {
return;
}
node->val = node->next->val;
if(node->next->next) {
node->next = node->next->next;
}
else{
node->next = NULL;
}
}
};