线性表-双向链表
双向链表
定义:双向链表(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;
结果如下: