线性表-双向链表

线性表-双向链表

双向链表

定义:双向链表(double linked list)是在单链表的每个节点中,再设置一个指向其前驱节点的指针域。

每个节点都有一个直接前驱和直接后继

初始化节点
图示如下:
在这里插入图片描述
代码如下:

//C++代码
typedef struct _Node
{
	int data;
	_Node* front = NULL;//前驱
	_Node* after = NULL;//后继
}Node;
int main()
{
	Node *headNode = NULL;//头指针
	Node *endNode = NULL;//尾指针
	int i = 1;
	//尾添加
	while (i <= 5)//5个节点
	{
		//新的节点
		Node *p = new Node();
		p->data = i;
		p->front = NULL;
		p->after = NULL;
		if (headNode == NULL || endNode == NULL)
		{
			//头尾指针指向同一节点
			headNode = p;
			endNode = p;
		}
		else
		{
			endNode->after = p;//尾指针指向新的节点
			p->front = endNode;//新节点的前驱指向尾指针
			endNode = p;//设置新的尾指针
		}
		i++;
	}
	return 0;
}

结果如图:
在这里插入图片描述

插入节点

图示如下:
在这里插入图片描述

//C++代码
typedef struct _Node
{
	int data;
	_Node* front = NULL;//前驱
	_Node* after = NULL;//后继
}Node;
int main()
{
	Node *headNode = NULL;//头指针
	Node *endNode = NULL;//尾指针
	int i = 1;
	//尾添加
	while (i <= 5)//5个节点
	{
		//新的节点
		Node *p = new Node();
		p->data = i;
		p->front = NULL;
		p->after = NULL;
		if (headNode == NULL || endNode == NULL)
		{
			//头尾指针指向同一节点
			headNode = p;
			endNode = p;
		}
		else
		{
			endNode->after = p;//尾指针指向新的节点
			p->front = endNode;//新节点的前驱指向尾指针
			endNode = p;//设置新的尾指针
		}
		i++;
	}
	Node *pTemp = headNode;//临时节点
	//插入的节点
	Node *pNewNode = new Node();
	pNewNode->data = 10;//插入节点的数值
	pNewNode->after = NULL;//插入节点的after
	pNewNode->front = NULL;//插入节点的front
	//插入下标为3
	int index = 3;
	for (int i = 0; i < 3; i++)//找到要插入下标的前一个节点
	{
		pTemp = pTemp->after;//找到插入节点的下一个节点
	}
	pTemp->front->after = pNewNode;			//新的节点 赋值给 下标为3的节点的前继的后驱  ① ③ 断开②
	pNewNode->front = pTemp->front;			//下标为3的节点的前驱 赋值给 新节点的前驱  ① ④
	pTemp->front = pNewNode;			//新节点 赋值给 下标为3的节点的前继 ⑤ 断开①
	pNewNode->after = pTemp;			//下标为3的节点 赋值给 新节点的后继 ⑥
	//遍历链表
	Node *temp = headNode;
	while (temp != NULL)
	{
		cout << temp->data << endl;
		temp = temp->after;
	}
	return 0;
}

结果如图:
在这里插入图片描述

删除节点
图示如下:

typedef struct _Node
{
	int data;
	_Node* front = NULL;//前驱
	_Node* after = NULL;//后继
}Node;
int main()
{
	Node *headNode = NULL;//头指针
	Node *endNode = NULL;//尾指针
	int i = 1;
	//尾添加
	while (i <= 5)//5个节点
	{
		//新的节点
		Node *p = new Node();
		p->data = i;
		p->front = NULL;
		p->after = NULL;
		if (headNode == NULL || endNode == NULL)
		{
			//头尾指针指向同一节点
			headNode = p;
			endNode = p;
		}
		else
		{
			endNode->after = p;	//尾指针指向新的节点
			p->front = endNode;	//新节点的前驱指向尾指针
			endNode = p;		//设置新的尾指针
		}
		i++;
	}
	//删除节点
	Node *p = headNode;
	//删除下标为3
	int index = 3;
	for (int i = 0; i < index; i++)//找到要删除的下标
	{
		p = p->after;
	}
	Node *pDelete = p;			//记录删除的节点
	p->front->after = p->after;		//下标为3的节点后继 赋值给 下标为3的节点前驱的后继 ①
	p->after->front = p->front; 		//下标为3的节点前驱 赋值给 下标为3的节点后继的前驱 ②
	delete pDelete;				//删除节点
	//遍历链表
	Node *temp = headNode;
	while (temp != NULL)
	{
		cout << temp->data << endl;
		temp = temp->after;
	}
	return 0;

结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43340991/article/details/83578749