(八)双链表算法之删除节点
算法分析
和单链表的删除一样,双链表的删除节点也是分为两步:找到要删除的节点;删除找到的节点。
如果删除的节点是尾节点
![](https://i-blog.csdnimg.cn/blog_migrate/b851b13763d5682ed921c7a21430e04d.png)
- 遍历找到尾部节点;
- 断开如图两处连接;
- 当前节点的前一节点指向NULL;
- 释放当前节点。
如果删除的节点不是尾部节点 - 遍历找到要删除的节点;
- 依次断开如图所示连接;
- 当前节点的前一节点的pNext指向下一节点;
- 当前节点的下一节点的pPrev指向当前节点的前一节点;
- 释放当前节点空间。
代码实现
1int delete_node(struct node *pH,int data)
2{
3 struct node *p = pH;
4 if(p = NULL)
5 return -1;
6 while(NULL != p -> pNext)
7 {
8 p = p ->pNext; //跳过头节点
9 if(p -> data == data)
10 {
11 if(NULL == p -> pNext)尾部节点
12 {
13 p -> pPrev -> pNext = NULL;
14 }
15 else
16 {
17 p -> pPrev -> pNext = p -> pNext;
18 p -> pNext -> pPrev = p -> pPrev;
19 }
20 }
21 free(p);
22 return 0;
23 }
24 printf("未找到要删除的节点.\n");
25 return -1;
26}