以b站王道考研讲的数据结构为例
写法是做一个while循环
将后一结点的数据复制到当前结点,free后继节点
后继节点:我成替身了
while(p)
{
if (p->data == data)
{
Node* q = p->next;
p->data = p->next->data;
p->next = q->next;
free(q);
cout << "已删除" << endl;
return;
}
因此在删除最后一个结点时既没有办法找到后一结点,也没办法找到前一结点、
在另一种写法里,可以做双重判断
if(p->next==e&&p->next->next==NULL)//e为要删除的值
这时就有了前面结点的值
while(p)
{
if (p->next->data == data &&p->next->next==NULL)
{
......//和上述一样的方法
cout << "已删除,此时为最后一个结点" << endl;
return;
}
if (p->data == data)
{
......//和上述一样的方法
cout << "已删除" << endl;
return;
}
p=p->next;
}
这样的时间还是会耗费多一次,从T(n)变成T(2n) ,时间复杂度O(n)是不变的