双链表全部知识总结(初始化、插入、删除、遍历)

简介: 双链表知识总结包括思路分析、代码实现

1.双链表的初始化

初始化双链表:首先通过malloc函数分配一个头结点空间,通过判断链表L是否为空来确定是否分配成功。将头结点的prior永远指向NULL,头结点的下一个结点暂时没有所以也指向NULL

bool InitDLinkList(DLinkList &L){
    L=(DNode *) malloc(sizeof(DNode));
    if(L==NULL)
        return false;
    L->prior=NULL;
    L->next=NULL;
    retrun true;
}

1.1 判断双链表是否为空

要想判断双链表是否为空,即判断头结点的next的指针是否为空

bool Empty(DLinkList L){
    if(L->next==NULL)
        return false;
    else 
        return true;
}

2.双链表的插入

实现需求:在p结点之后插入s结点

2.1 p结点不是最后一个结点

网络异常,图片无法展示
|
分析步骤:

  1. 首先会把s结点指向p->next结点
  2. p的后继结点的前向指针指向s
  3. s结点的前向指针指向p结点
  4. p的后向指针指向s结点

网络异常,图片无法展示
|

代码实现:

bool InsertNextDNode(DNode *p, DNode *s){
    s->nest=p->next;
    p->next->prior=s;
    s->prior=p;
    p->next=s;
}

2.2 p结点是最后一个结点

网络异常,图片无法展示
|
当p结点是最后一个结点的时候,显然这时候p->next=NULL,所以就需要对 p->next->prior=s改良,判断p结点是否有后续结点,从而判断是不是需要修改p下一个结点的前向指针

if(p==NULL || S==NULL)
    return false;
s->next=p->next;
if(p->next!=NULL)
    p->next->prior=s;

3.双链表的删除

3.1 删除p的后继节点

分析:和插入的思考方式一样,同样我们需要考虑p的后继结点是否为NULL。

  1. 找到p的后继结点
  2. 判断p的后继结点是否为NULL,为NULL即p没有后继
  3. 将p的下一个结点指向q的下一个结点
  4. 判断q结点是否为最后一个结点
  5. free(q)

代码实现:

bool DeleteNextDNode(DNode *p){
    if(p==NULL)
        return false;
    DNode *q=p->next;
    if(q==NULL)
        return false;
    p->next=q->next;
    if(q->next!=NULL)
        q->next->prior=q;
    free(q);
    return true;
}

3.2 销毁链表

实现步骤:

  1. 循环释放各个数据结点
  2. 同时释放头结点
  3. 头指针指向空
void DestoryList(DLinkList &L){
    while(L->nex!=NULL)
        DeleteNextDNode(L);
    free(L);
    L=NULL;
}

4.双链表的遍历

对结点p做相应的处理,如打印

4.1 后向遍历

while(p!=NULL){
    p=p->next;
}

4.2 前向遍历

while(p!=NULL){
    p=p->prior;
}

4.3 前向遍历(跳过头结点)

while(p->prior=NULL){
    p=p->prior;
}

5.总结

  1. 修改指针的时候需要注意顺序
  2. 双链表可以很方便的找到给定结点的前驱节点,对前驱节点执行后插操作,这样就可以实现按位序插入的前插操作。
  3. 双链表不具备随机存取特性,查找操作只能通过顺序遍历实现
目录
相关文章
|
5月前
|
存储
链表的遍历方式
链表的遍历方式
|
6月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
67 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
7月前
双链表的插入,删除以及遍历
双链表的插入,删除以及遍历
49 6
|
7月前
|
存储
线性表、链表、栈和队列的初始化
线性表、链表、栈和队列的初始化
41 1
|
7月前
|
存储 C语言
链表—初始化指针变和创建新的节点------区别应用分析
链表—初始化指针变和创建新的节点------区别应用分析
链表遍历,链表查找和统计节点,链表插入新节点,链表删除节点,链表修改指定节点,链表头插法,尾插法总结
链表遍历,链表查找和统计节点,链表插入新节点,链表删除节点,链表修改指定节点,链表头插法,尾插法总结
|
7月前
|
算法 Python Java
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
46 0
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
|
7月前
|
算法 Java C++
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
63 0
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
|
7月前
|
Go Java C++
Java每日一练(20230409) 多数元素、反转链表 II 、日期之间的遍历
Java每日一练(20230409) 多数元素、反转链表 II 、日期之间的遍历
52 0
Java每日一练(20230409) 多数元素、反转链表 II 、日期之间的遍历
|
C++
数据结构循环链表之循环链表遍历 | 第三套
数据结构循环链表之循环链表遍历 | 第三套
39 0