双向链表(2) - 删除节点

在双向链表中删除一个指定的节点,可以分为下面的这3种情况:

(a) 原始的双向链表

(b) 删除头节点后

(c) 删除中间节点后

(d) 删除尾节点后

算法

假设需要被删除的节点称之为delNode.

1) 如果delNode为头节点,则将头指针指向后续的节点。

2) 如果delNode的前向节点存在,则将前向节点的后向指针置为delNode的后向指针。

3) 如果delNode的后向节点存在,则将后向节点的前向指针置为del的前向指针。

#include <iostream>

struct Node
{
	int data;
	Node *next; // 指向下一个节点
	Node *prev; // 指向前一个节点
};

/*
实现双向链表中删除一个节点
head --> 链表的头部指针.
delNode  -->  需要被删除的节点
*/
void deleteNode(Node **head, Node *delNode)
{
	//是否为空链表
	if (*head == NULL || delNode == NULL)
		return;

	//删除头节点
	if (*head == delNode)
		*head = delNode->next;

	//被删节点不是尾节点
	if (delNode->next != NULL)
		delNode->next->prev = delNode->prev;

	//被删节点不是首节点
	if (delNode->prev != NULL)
		delNode->prev->next = delNode->next;

	delete delNode;
	return;
}

// 给定链表的头指针(head)以及一个整数,插入一个新的节点至链表的头部
// 之所以传入双指针,因为函数中需要修改链表
void push(Node** head, int newData)
{
	//1. 分配新节点内存
	Node* newNode = new Node;

	//2. 赋值
	newNode->data = newData;

	//3. 将原始头节点做为新节点的后向指针,而前向指针置为NULL
	newNode->next = (*head);
	newNode->prev = NULL;

	//4. 将原始头节点的前向指针置为新的节点
	if ((*head) != NULL)
		(*head)->prev = newNode;

	//5. 将头指针置为新的节点
	(*head) = newNode;
}

void printList(Node *head)
{
	while (head != NULL)
	{
		std::cout<<" "<<head->data<<" ";
		head = head->next;
	}
	std::cout << std::endl;
}

int main()
{
	//初始化链表为:10<->8<->6<->4<->2<->0
	Node* head = NULL;
	push(&head, 0);
	push(&head, 2);
	push(&head, 4);
	push(&head, 6);
	push(&head, 8);
	push(&head, 10);

	std::cout << "Original DLL is: ";
	printList(head);

	//删除首节点10
	deleteNode(&head, head);
	//删除中间节点4
	deleteNode(&head, head->next->next);
	//删除尾节点0
	deleteNode(&head, head->next->next->next);

	std::cout << "New DLL is: ";
	printList(head);
	return 0;
}

输出:

Original DLL is: 10 8 6 4 2 0

New DLL is: 8 6 2

时间复杂度: O(n)

时间: 2024-10-11 17:14:54

双向链表(2) - 删除节点的相关文章

C语言双向链表简单实现及图示(初始化/插入节点/删除节点)

-------------------------------------------- 双向链表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 和单向链表相比有以下优势: 插入删除不需要移动元素外,可以原地插入删除 可以双向遍历 - - - - -

红黑树之删除节点

红黑树之删除节点 上一篇文章中讲了如何向红黑树中添加节点,也顺便创建了一棵红黑树.今天写写怎样从红黑树中删除节点. 相比于添加节点,删除节点要复杂的多.不过我们慢慢梳理,还是能够弄明白的. 回顾一下红黑树的性质 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色.在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色或黑色. 根节点是黑色. 每个叶节点(这里的叶节点是指NULL节点,在<算法导论>中这个节点叫哨兵节点,除了颜色属性外,其他属性值都为任

Hadoop 新增删除节点

1 新增Data节点 1.1 修改/etc/hosts,增加datanode的ip 1.2 在新增加的节点启动服务 hadoop-daemon.sh start datanode yarn-daemon.sh start nodemanager 1.3 均衡block start-balancer.sh 1)如果不balance,那么cluster会把新的数据都存放在新的node上,这样会降低mapred的工作效率 2)设置平衡阈值,默认是10%,值越低各节点越平衡,但消耗时间也更长 start

jQuery DOM操作之删除节点

下面示例可能用到如下HTML代码: <ul>   <li title="t1">苹果</li>   <li>香蕉</li>   <li>橘子</li>   <li>葡萄</li>   <li>草莓</li> </ul> 1.remove()方法: 作用:从DOM中删除所有匹配的元素,传入的参数用于根据jQuery表达式来筛选元素. 例如,删除上

jQuery插入,复制、替换和删除节点

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>jQuer

js 访问,插入,替换,创建,删除节点介绍

访问选定元素节点下的所有子节点的列表,返回的值可以看作是一个数组,他具有length属性.语法:elementNode.childNodes注意:如果选定的节点没有子节点,则该属性返回不包含节点的 NodeList. 注意:1. IE全系列.firefox.chrome.opera.safari兼容问题2. 节点之间的空白符,在firefox.chrome.opera.safari浏览器是文本节点,所以IE是3,其它浏览器是7, 访问子节点的第一和最后项一.firstChild 属性返回'chi

二叉平衡树之删除节点

二叉平衡树之删除节点操作 更好的判断最小非平衡树类型的方法 在前一篇文章中,我们知道最小非平衡树可以分为四种类型,即:LL型.LR型.RR型和RL型.而且我也按照自己的理解,归纳了判断是哪种类型的方法.总结一下就是:设最小非平衡树的树根为unbalance,首先看unbalance的左右子树谁更高,如果左子树更高则为LX型.如果是右子树高则为RX型.再进一步,如果为LX型,将刚刚插入的节点的值value与unbalance左孩子进行比较,如果value大则为LR型,如果value小则为LL型.如

添加删除节点

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>jQuery插入,复制.替换和删除节点</title> <script type="text/javascript" src="jquery-1.3.2.js"></scri

Javascript 笔记与总结(2-10)删除节点,创建节点

[删除节点] 步骤: ① 找到对象 ② 找到他的父对象 parentObj ③ parentObj.removeChild(子对象); [例] <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #div1{ width: 300px; heigh