小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
先决条件: 双向链表集1| 介绍和插入
编写一个函数来删除双向链表中的给定节点。
原始双向链表
算法
- 让要删除的节点为del。
- 如果要删除的节点是头节点,则将头指针更改为下一个当前头。
if headnode == del then
headnode = del.nextNode
- 如果 previous 的 del 存在,则将 next 的 next 设置为 del。
if del .nextNode != none
del .nextNode.previousNode = del .previousNode
- 如果 del 的 next 存在,则将 next 的 prev 设置为 del。
if del .previousNode != none
del .previousNode.nextNode = del .next
从双向链表中删除节点的C++程序
#include <bits/stdc++.h>
using namespace std;
/* 双向链表的一个节点 */
class Node
{
public:
int data;
Node* next;
Node* prev;
};
删除双向链表中节点的函数.head_ref --> 指向头节点的指针pointer.del --> 指向要删除的节点的指针。
void deleteNode(Node** head_ref, Node* del)
{
if (*head_ref == NULL || del == NULL)
return;
if (*head_ref == del)
*head_ref = del->next;
if (del->next != NULL)
del->next->prev = del->prev;
if (del->prev != NULL)
del->prev->next = del->next;
free(del);
return;
}
实用功能, 在双向链表的开头插入一个节点的函数
void push(Node** head_ref, int new_data)
{
Node* new_node = new Node();
new_node->data = new_data;
new_node->prev = NULL;
new_node->next = (*head_ref);
if ((*head_ref) != NULL)
(*head_ref)->prev = new_node;
(*head_ref) = new_node;
}
在给定的双向链表中打印节点的函数 此函数与单向链表的 printList() 相同
void printList(Node* node)
{
while (node != NULL)
{
cout << node->data << " ";
node = node->next;
}
}
驱动代码
int main()
{
/* 从空列表开始 */
Node* head = NULL;
push(&head, 2);
push(&head, 4);
push(&head, 8);
push(&head, 10);
cout << "原始链表 ";
printList(head);
/* 从双向链表中删除节点 */
deleteNode(&head, head);
deleteNode(&head, head->next);
deleteNode(&head, head->next);
/* 修改后的链表将为NULL<-8->NULL */
cout << "\n修改链表 ";
printList(head);
return 0;
}
输出:
原始链表 10 8 4 2
修改链表 8
复杂度分析:
- 时间复杂度: O(1)。
由于不需要遍历链表,因此时间复杂度是恒定的。 - 空间复杂度: O(1)。
由于不需要额外的空间,所以空间复杂度是恒定的。
🥇 往期优质文章
📣尾注: 想要获取更多数据结构相关的知识,你可以关注我:海拥,我希望你觉得这篇文章有帮助。
如果你看到这里,感谢你的阅读 :)
💌 欢迎大家在评论区提出意见和建议!💌
如果你真的从这篇文章中学到了一些新东西,喜欢它,收藏它并与你的小伙伴分享。🤗最后,不要忘了❤或📑支持一下哦。