数据结构删除双向链表中的节点 | 第二套

572 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

先决条件:  双向链表集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)。 
    由于不需要额外的空间,所以空间复杂度是恒定的。

🥇 往期优质文章

数据结构双向链表的介绍和插入 | 第一套

📣尾注: 想要获取更多数据结构相关的知识,你可以关注我:海拥,我希望你觉得这篇文章有帮助。

如果你看到这里,感谢你的阅读 :)

💌 欢迎大家在评论区提出意见和建议!💌

如果你真的从这篇文章中学到了一些新东西,喜欢它,收藏它并与你的小伙伴分享。🤗最后,不要忘了❤或📑支持一下哦。