链表删除
在本文中,我们将学习如何从链表中删除节点。
链表删除算法
令 head 为指向链表第一个节点的指针,令 temp 为要从链表中删除的节点的值。
迭代算法
-
初始化指针
curr指向head以遍历链接列表,而将prev设置为null以在删除时跟踪temp之前的节点。 -
如果要删除的节点是
head即temp!=null&&curr->data==temp,则将head设置为curr->next并删除curr。 -
否则,请执行以下操作,直到我们到达要删除的节点为止。
-
prev=temp。 -
temp=temp->next。
-
-
如果
temp==null,返回; -
将
prev->next设置为temp->next,并删除temp节点。
递归算法
-
如果
head==null,则链表为空,没有要删除的元素。因此,返回; -
如果
head->data==temp,即我们找到了要删除的节点-
将
head存储在临时节点t中。 -
将
head设置为head->next以删除该节点。 -
删除
t并返回到较早的递归调用。
-
将
-
如果以上条件均不满足,则递归调用
head->next上的deletenode()以继续寻找节点。
链接列表删除图解
假设我们具有以下链接列表 1 -> 2 -> 3 -> 4,并且我们想删除值为 3 的节点。
-
用值
1和prev将指向head节点的指针curr初始化为null。 -
反复移动
curr,直到到达值为3和prev为2的节点。 -
将
prev(即2)指向curr->next(即4)。 -
删除值为
3的curr节点。
链接列表删除实施
#include using namespace std;
class node {
public:
int data;
node* next;
node(int x) {
this->data = x;
this->next = null;
}
};
void deletenode(node*& head, int val)
{
if (head == null) {
cout << "element not present in the list\n";
return;
}
if (head->data == val) {
node* t = head;
head = head->next;
delete (t);
return;
}
deletenode(head->next, val);
}
void deleteiter(node** head, int x)
{
node* temp = *head;
node* prev = null;
if (temp != null && temp->data == x)
{
*head = temp->next;
delete temp;
return;
}
else
{
while (temp != null && temp->data != x)
{
prev = temp;
temp = temp->next;
}
if (temp == null)
return;
prev->next = temp->next;
delete temp;
}
}
void printlist(node* head)
{
node*curr = head;
while (curr != null) {
cout << curr->data << " ";
curr = curr->next;
}
cout << "\n";
}
int main()
{
node* head = new node(1);
head -> next = new node(2);
head->next->next = new node(3);
head->next->next->next = new node(4);
head->next->next->next->next = new node(5);
printlist(head);
deletenode(head, 3);
printlist(head);
deleteiter(&head, 4);
printlist(head);
return 0;
}
链表删除算法的复杂性
时间复杂度
- 平均情况
要删除链接列表中第 i 个位置的节点,我们必须访问 i 个节点。因此,时间复杂度约为 o(i)。而且,链表中有 n 个节点,因此平均情况下的时间复杂度为 o(n/2) 或 o(n)。时间复杂度约为 o(n)。
- 最佳情况
最好的情况是当我们要删除链接列表的开头时。最佳情况下的时间复杂度是 o(1)。
- 最坏情况
最坏情况下的时间复杂度是 o(n)。这与平均情况下的时间复杂度相同。
空间复杂度
在迭代实现的情况下,此算法的空间复杂度为 o(1),因为它除了临时变量外不需要任何数据结构。
在递归实现中,由于递归调用堆栈所需的空间,空间复杂度为 o(n)。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
将二叉树转换为二叉搜索树
发布时间:2023/03/20 浏览次数:185 分类:算法
-
本教程教大家如何将二叉树转换为二叉搜索树。二叉树是一种非线性数据结构。它被称为二叉树,因为每个节点最多有两个子节点。这些子节点被称为左子和右子。
发布时间:2023/03/20 浏览次数:189 分类:算法
-
本教程介绍了二叉搜索树的删除操作。
发布时间:2023/03/20 浏览次数:232 分类:算法
-
本教程介绍了二叉树上的树遍历中序遍历、前序遍历和后序遍历。
