双向链表的基本操作

作者: sugar_coated | 来源:发表于2016-06-15 22:07 被阅读940次
  • 我想你在看这之前已经掌握了单向链表了,如果对单向链表不是很了解,可以看看这篇文章o( ̄▽ ̄)ブ。
    http://www.jianshu.com/p/1b6309b6c9ab

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

节点的编写

struct node {
    int val;//节点中存的值
    node *prior;//前驱结点
    node *next;
};

双链表的创建

node *creat( ) {
    node *head = nullptr, *tail;
    int num;
    while(cin >> num && num) {//以输入0结束创建
        node *pNode = new node;
        pNode->val = num;
        if(!head) {
            head = pNode;
            head->prior = nullptr;
            head->next = nullptr;
            tail = head;
            continue;
        }
        pNode->prior = tail;
        pNode->next = nullptr;
        tail->next = pNode;
        tail = pNode;
    }
    return head;
}

链表的输出

void output(node *head) {
    if(!head) return ;
    for(node *pNode = head; pNode; pNode = pNode->next)
        cout << pNode->val << " ";
    cout << endl;
}

删除 (删除多个或一个)

void remove(node *head, const int num) {
    if(!head) return ;
    node *pNode = head;
    while(pNode->next) {
        bool flag = 0;//用于标记是否删除过,使可以删除连续相同的两个节点
        if(pNode->next->val == num) {
            flag = 1;//表示删除过
            node *dNode = pNode->next;
            pNode->next = dNode->next;
            if(dNode->next)//最后一个节点的next为nullptr,是没有前驱的
                dNode->next->prior = pNode;
            delete dNode;
            //如果删除一个,就加break;
        }
        if(!flag && pNode->next)//删除过就不需要更新pNode,因为在删除前已经更新过pNode了
            pNode = pNode->next;
    }
}

测试

#include <iostream>
#include <cstdio>
using namespace std;

struct node {
    int val;
    node *prior;//前驱结点
    node *next;
};
int main() {
    node *head = nullptr;
    head = creat();
    output(head);
    
    int num;
    cin >> num;
    remove(head, num);
    output(head);
    
    return 0;
}

C++11编译通过(/▽\=)

Paste_Image.png
插入等基本操作与单链表相似,这里就不多说了,你懂的(http://www.jianshu.com/p/1b6309b6c9ab
代码写的很简洁,只为说明问题,有什么不好的地方,欢迎拍砖!(●'◡'●)

相关文章

  • C++实现双向循环链表

    本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表...

  • C++语言实现双向链表

    这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大...

  • 9.双向链表DoubleLinkList

    目录:1.双向链表的定义2.双向链表的图解3.双向链表定义操作4.双向链表的实现 1.双向链表的定义 2.双向链表...

  • 双向链表的基本操作

    我想你在看这之前已经掌握了单向链表了,如果对单向链表不是很了解,可以看看这篇文章o( ̄▽ ̄)ブ。http://ww...

  • # 数据结构之循环链表(四)

    在上一篇博客中,我讲了有关于单循环链表的一些基本操作。在这篇博客中,我来讲述一下双向链表和双向循环链表。 循环链表...

  • 6.双向链表

    双向链表结构: 既然单链表可以有循环链表,那么双向链表当然也可以有: 双向链表的插入操作: s->next = p...

  • [源码和文档分享]基于QT实现的可视化链表(单链表、循环链表、双

    1.1 题目 题号1:分别以单链表、循环链表、双向链表为例,实现线性表的建立、插入、删除、查找等基本操作。 要求:...

  • 数据结构之双向链表

    1.双向链表 1.1双向链表创建示意图 分析 双向链表的遍历,添加,修改,删除的操作思路===》代码实现: 遍历 ...

  • 五. java数据结构 - 双向链表

    1. 双向链表的操作分析和实现 使用带 head 头的双向链表实现 –水浒英雄排行榜 分析 双向链表的遍历,添加,...

  • List(二):LinkedList源码分析

    LinkedList以双向链表实现,链表无容量限制,但是双向链表本身就使用了更多的空间,也需要额外的链表指针操作....

网友评论

  • Sucifer:你都不看我的文章。

本文标题:双向链表的基本操作

本文链接:https://www.haomeiwen.com/subject/svkpdttx.html