首页
学习
活动
专区
圈层
工具
发布

DS双向链表—祖玛 C++

题目描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。...你的任务是,在各次操作之后及时计算出新的珠子序列。 输入 第一行是一个由大写字母'A'~'Z'组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。...若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。 输出 输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。...using namespace std; class Node { public: char data; Node * next = NULL; }; class List {//带头结点的单链表...List(); //析构函数,逐个结点回收 int Insert(char item, int i); //第i位置插入元素,操作成功或失败返回OK或ERROR void print();//打印单链表所有数据

40630

C# 算法之链表、双向链表以及正向反向遍历实现

1、简介 链表是一种非常基础的数据结构之一,我们在日常开发种都会接触到或者是接触到相同类型的链表数据结构.所以本文会使用C#算法来实现一个简单的链表数据结构,并实现其中几个简单的api以供使用. 2、概述...,使其指向下一个元素 /// bool SetNext(); } } 4、实战 双向链表 双向链表的应用场景很多...,比如Redis的List就是使用双向链表实现的.这种形式的链表更加的灵活....,使其指向下一个元素 /// bool SetNext(); } } 5、通过双向链表实现反向遍历 如果没有实现链表的双向功能...,实现反向遍历的功能是不可能,实际上Redis的List是实现了这个功能的,所以这里我也实现下,tip:目前为止,所以的遍历都是先进先出的,类似于队列,所以如果实现了反向遍历,从而该双向链表同时也支持了先进后出的功能

90830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android中的双向链表「建议收藏」

    在init源代码中双向链表listnode使用非常多,它仅仅有prev和next两个指针,没有不论什么数据成员。...这里须要考虑的一个问题是,链表操作都是通过listnode进行的,但是那只是是个连接件。...当我们顺着链表取得当中一项的listnode结构时,又如何找到其宿主结构呢?在listnode结构中并没有指向其宿主结构的指针啊。毕竟。我们我真正关心的是宿主结构。而不是连接件。...node_to_item(node,container,member) \ (container*)(((char*)(node))-offsetof(container,member)) //向list双向链表尾部加入...node节点,list始终指向双向链表的头部(这个头部仅仅含有prev/next) void list_add_tail(listnode *list,listnode *node) {

    93710

    【C++】深入理解List:双向链表的应用

    前言 这是我自己学习C++的第七篇博客总结。后期我会继续把C++学习笔记开源至博客上。...2. string类的底层其实是一个储存字符的顺序表结构,而vector类的底层是一个顺序表模板,使用时需要显示实例化,而list类的底层是一个双向链表模板,使用时也需要显示实例化,后面的笔记中以整形为例...类对象中尾插整数num。...2. list.pop_back(),在list类对象中尾删。 3. list.push_front(num),在list类对象的首元素之前插入一个元素num。...注意反向迭代器进行迭代的步骤也是++,反向迭代器是用来反向遍历链表的。 5. 范围for循环,用于有范围的集合进行遍历,C++11中引入了基于范围的for循环。

    24810

    C++ 链链不忘@必有回响之双向链表

    前言 写过一篇与单链表相关的博文,实际应用中,双向循环链表的功能更强大。 单链表中,查询一个已知结点的后驱结点的时间复杂度为O(1)。...双向链表 双向链表中除了有存储头结点的head头指针变量外,一般还会增加一个存储尾结点的名为tail尾指针变量。这样,可以实现从头到尾或从尾到头对链表进行遍历。...在双向链表中,在尾结点的后驱指针位存储头结点地址,头结点的前驱指针位存储尾结点地址,形成一个首尾相连的闭环,称这样的链表为双向循环链表。...双向链表需要提供对链表中的数据进行常规维护的算法,如: 链表初始化。 创建链表。 查找。 后插入、前插入。 删除。...…… 算法的整体思路和单链表相似,因结点中多了一个前驱结点信息,为各种操作带来便利的同时,需要注意细节。下文将介绍双向链表中的几个重要函数。

    40410

    C++ STL源码剖析之双向环形链表list

    C++ STL源码剖析之双向环形链表list 0. 导语 源码对应的版本为gcc-4.9.1 1.list list为双向环形链表,其结构为: ? 自己绘制的图如下: ?...list_all 双向环状链表从节点值为3开始插入,红色框表示最后一个节点(end()指向的节点)。黄色线条表示指向前驱节点,黑色线条表示指向后继节点。...像前面提到的push_back、push_front、_M_insert,还有insert都是使用最基础的双向链表插入函数_M_hook实现的。...list链表容器的访问方式是双向迭代器,因此,不能使用STL本身的排序算法sort,必须自己定义属于自己访问的排序算法。...在sort中还有一个函数swap,完成两个链表交换,实现代码在gcc-4.9.1/libstdc++-v3/src/c++98/list.cc中: void _List_node_base::swap(

    1.8K40

    Linux内核中双向链表的经典实现

    概要 本文对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of。...Linux中双向链表的经典实现 1.Linux中双向链表介绍 Linux双向链表的定义主要涉及到两个文件: include/linux/types.h include/linux/list.h Linux...中双向链表的使用思想 它是将双向链表节点嵌套在其它的结构体中;在遍历链表的时候,根据双链表节点的指针获取"它所在结构体的指针",从而再获取数据。...通过双向链表将人进行关联的模型图如下: ? person代表人,它有name和age属性。为了通过双向链表对person进行链接,我们在person中添加了list_head属性。...3.Linux中双向链表的使用示例 双向链表代码(list.h): 1 #ifndef _LIST_HEAD_H 2 #define _LIST_HEAD_H 3 // 双向链表节点 4 struct

    3.1K30

    C++:list(带头双向链表)增删查改模拟实现

    一、list底层带头双向链表验证,节点构造 1.1节点的构造: 节点和数据结构中双向链表的节点一样,有三个变量:节点数据,下一个节点(next),上一个节点(prev) 小问题:...后续如果在一个类中调整其访问权限可以使用typedef在使用访问限定符修饰即可(typedef受访问限定符的限定) 1.2list底层数据结构(带头双向链表) 这里我们通过SGI...库中list的成员变量和构造函数来验证,取底层数据结构是带头双向链表。...二 迭代器总结 本博客采用SGI版本,C++:list增删查改的模拟实现使用的是带头双向链表,非常简单,只是这里对于迭代器的实现不像原来一样使用原声指针,实现较难。...很不幸的是C++库在list中不支持<<,很大原因也在于编译器不知到我们如何取数据 所以对于自定义类型我们可以先解引用在去访问成员,也可以在迭代器中重载operator->()函数。

    13210

    从零开始实现 C++ 双向链表:深入理解链表底层原理

    前言: 在 C++ 标准库中,std::list 是一种非常常用的数据结构,其底层采用了双向链表的实现。...在实际开发中,双向链表是一种具有灵活插入和删除操作的数据结构,尤其适合那些需要频繁操作非连续内存数据的场景。本文将通过一个手动实现的双向链表类 list 来讲解双向链表的底层结构和实现原理。 1....主要数据结构 在链表的实现中,节点是最基本的元素,每个节点存储数据以及指向前后节点的指针。为了支持双向操作,链表的每个节点都有两个指针,分别指向前驱节点和后继节点。...这确保了链表在被拷贝时能够正确复制内容。 3.2 链表的插入与删除 在双向链表中,插入和删除操作是其核心功能。我们通过 insert 函数将新元素插入到链表的指定位置。...这种设计使得我们可以在链表中进行双向遍历,并支持 O(1) 时间复杂度的插入和删除操作。 2.迭代器的实现:为了让链表可以像标准库中的容器一样被遍历,我们实现了 list_iterator。

    53010

    面试题47:Redis中list双向链表

    链表的特点是高效的删除和新增节点来灵活的调整链表中的元素顺序。 由于C语言没有内置链表,所以Redis自己构建了链表的实现。...Redis基本数据结构中的REDIS_LIST,底层的实现之一就采用的链表。即:当包含了很多元素,或者元素中有比较长的字符串时,就会采用链表作为REDIS_LIST的底层实现。...源码个注释如下所示: adlist.h /* * 双向链表节点 */ typedef struct listNode { // 前节点 struct listNode *prev;...// 后节点 struct listNode *next; // 本节点的值 void *value; } listNode; adlist.h /* * 双向链表...带表头/表尾指针:list结构中包含head指针和tail指针,所以获得链表头节点/尾节点的复杂度为O(1)。

    31910

    002 Linux内核中双向链表的经典实现

    概要 本文对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of。...Linux中双向链表的经典实现 1.Linux中双向链表介绍 Linux双向链表的定义主要涉及到两个文件: include/linux/types.h include/linux/list.h Linux...中双向链表的使用思想 它是将双向链表节点嵌套在其它的结构体中;在遍历链表的时候,根据双链表节点的指针获取"它所在结构体的指针",从而再获取数据。...通过双向链表将人进行关联的模型图如下: ? person代表人,它有name和age属性。为了通过双向链表对person进行链接,我们在person中添加了list_head属性。...3.Linux中双向链表的使用示例 双向链表代码(list.h): 1 #ifndef _LIST_HEAD_H 2 #define _LIST_HEAD_H 3 // 双向链表节点 4 struct

    2.2K20

    JavaScript 中的计算机科学:双向链表

    执行下面的代码,控制台依次输出双向链表反向遍历之后的每一个值: let current = tail;while (current !...属性 head 和 tail 分别用于定位列表中的第一个和最后一个节点。与单链表一样, head 和 tail 不推荐在类外访问。 双向链表中数据的添加 将元素添加到双向链表和添加到单向链表非常类似。...在这两种数据结构中,都需要先找到列表中最后一个节点,然后在其后面添加一个新节点。在单向链表中,必须要遍历整个列表以定位最后一个节点,而在双向链表中,直接使用 this[tail] 定位最后一个节点。...创建反向迭代器 您可以使用与单向链表中相同的 values() 和 Symbol.iterator 方法在 JavaScript 中创建可迭代的双向链表。...同时,在双向链表中,您还可以创建一个反向迭代器,它从 tail 开始向 head 生成数据。

    46130

    【C++】- 掌握STL List类:带你探索双向链表的魅力

    前言:  C++中的List容器是标准模板库(STL)中的一种序列容器,它实现了双向链表的功能。...一.list的介绍及使用 1. list的介绍 双向链表结构: list容器使用双向链表来存储元素,每个元素(节点)都包含数据部分和两个指针,分别指向前一个元素和后一个元素。...这种结构使得在链表的任何位置进行插入和删除操作都非常高效,时间复杂度为O(1)。 动态大小: list容器的大小可以在运行时动态改变,即可以在程序运行过程中添加或移除元素。...迭代器稳定性: 在list中插入或删除元素不会导致其他迭代器失效(除了指向被删除元素的迭代器)。这是因为它通过调整相邻节点的指针来维护链表结构,而不需要移动元素或重新分配内存。...因为list的底层结构为带头结点的双向循环链表,因此在list进行插入操作时不会导致迭代器失效,只有删除时才会失效,并且失效的是被删除节点的迭代器,其他迭代器不会受到影响。

    39010

    深入探索 C++ STL: 高效双向链表 list 的使用与实践

    C++ STL(Standard Template Library)的 list 容器是双向链表的实现,适合需要频繁插入和删除元素的场景。...概述 C++ 中的 list 是一个双向链表,与 vector 或 deque 相比,它的主要优点在于插入和删除操作效率较高,因为插入和删除操作只涉及局部的节点调整,而不会像 vector 那样涉及整个容器的重新分配...list 是 STL 容器中的一个重要成员,在需要高效的插入和删除操作时非常有用。...2. list 容器的特性 list 是双向链表,具有以下几个显著特性: 双向链表:每个节点都包含指向前一个节点和后一个节点的指针,支持从任意位置高效的插入和删除操作。...在这个示例中,我们使用 std::find 算法在 list 中查找元素。std::find 是线性搜索算法,因此它会从 list 的头部开始遍历,直到找到目标元素或遍历完整个链表。 10.

    49710

    链表----在链表中添加元素详解

    1.链表中头节点的引入 1.1基本的链表结构: ? 1.2对于链表来说,若想访问链表中每个节点则需要把链表的头存起来,假如链表的头节点为head,指向链表中第一个节点,如图: ?...0; }  2.在链表头添加元素 2.1初始时,假设链表如下: ?...2.3 在链表头添加新元素的相关代码 //在链表头添加新的元素e public void addFirst(E e) { Node node = new Node(e);...从上不难看出,对于在链表中添加元素关键是找到要添加的节点的前一个节点,因此对于在索引为0的节点添加元素就需要单独处理。...关于在链表中间添加元素的代码: //在链表的index(0--based)的位置添加新的元素e (实际不常用,练习用) public void add(int index, E e)

    4K30

    【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )

    文章目录 一、元素操作 1、首尾 添加 / 删除 元素 2、获取 首尾 元素 二、迭代器遍历容器 1、正向迭代与反向迭代 2、代码示例 一、元素操作 1、首尾 添加 / 删除 元素 list 双向链表容器...cout << *it << " "; // 迭代器指向下一个元素 it++; } // 回车换行 cout << endl; } int main() { // list 双向链表容器..., 崩溃退出 ; reference back(); const_reference back() const; 代码示例 : // list 双向链表容器 使用初始化列表构造 list<int...二、迭代器遍历容器 1、正向迭代与反向迭代 std::list 双向链表容器 提供了 begin、end、rbegin 和 rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的 迭代器 , 函数原型如下...end() const; 获取指向尾元素的反向迭代器 : 该函数返回一个反向迭代器 , 指向链表的最后一个元素 ; 如果链表为空 , 则此操作未定义 ; 反向迭代器从链表的尾部向头部移动 ; 获取指向首元素之前的反向迭代器

    96210

    【C++进阶】深入STL之list:高效双向链表的使用技巧

    前言:双向链表是链表数据结构的一种重要变体,它允许我们在链表的任何位置进行高效的插入和删除操作,而无需像数组那样进行大量的数据移动。...1. list的基本概念 list 是 C++ 标准模板库 (STL) 中的一个容器,它基于双向链表实现。...双向链表是一种动态数据结构,由一系列节点组成,每个节点包含数据元素和两个指向其他节点的指针 在介绍list的使用之前,我们先来看看它的结构: 实际上:list就是一个带头双向链表 2. list...因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响 void...list以其基于双向链表的特性,为我们提供了在序列容器中进行高效插入和删除操作的强大工具。

    1.1K10
    领券