双向链表

C++list容器

ⅰ亾dé卋堺 提交于 2020-01-20 16:39:33
1、双向链表简介    list 是顺序容器的一种。list 是一个双向链表。使用 list 需要包含头文件 list。双向链表的每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素。在 list 容器中,在已经定位到要增删元素的位置的情况下,增删元素能在常数时间内完成。list 容器不支持根据下标随机存取元素。 2、成员函数   void push_front(const T & val) 将 val 插入链表最前面   void pop_front() 删除链表最前面的元素   void sort() 将链表从小到大排序   void remove (const T & val) 删除和 val 相等的元素   remove_if 删除符合某种条件的元素   void unique() 删除所有和前一个元素相等的元素   void merge(list <T> & x) 将链表 x 合并进来并清空 x。要求链表自身和 x 都是有序的   void splice(iterator i, list <T> & x, iterator first, iterator last) 在位置 i 前面插入链表 x 中的区间 [first, last),并在链表 x 中删除该区间。链表自身和链表 x 可以是同一个链表,只要 i 不在 [first, last) 中即可  

C++实现双向链表

こ雲淡風輕ζ 提交于 2020-01-18 07:36:22
#include<iostream> using namespace std; class DblList; class DblListNode { friend class DblList; public: int data; DblListNode *llink,*rlink; }; class DblList { public: DblList() { first=new DblListNode(); first->llink=first->rlink=first; } void Insert(DblListNode*,DblListNode*); void Delete(DblListNode*); //private: public: DblListNode *first; }; void DblList::Insert(DblListNode *p,DblListNode *x)//p表示新插入的节点插入x节点的右边 { p->llink=x; p->rlink=x->rlink; x->rlink->llink=p; x->rlink=p; } void DblList::Delete(DblListNode *x) { if(x==first) cout<<"cant"<<endl; else{ x->llink->rlink=x->rlink; x->rlink-

双向链表C++实现

℡╲_俬逩灬. 提交于 2020-01-15 05:47:32
双向链表实现,通过C++实现 #ifndef LinkList_hpp #define LinkList_hpp typedef struct Node{ int data; Node* next; Node* pre; }Node; class LinkList{ private: Node *head; Node *tail; int length; public: LinkList(); //分配内存,构建节点 Node* makeNode(); //添加节点到链表尾 bool push(int data); //弹出链表最后一个节点,并返回值 int pop(); //通过index来查找链表中的元素 int objectAt(int index); //插入元素到指定位置的前方 bool insert(int index,int data); //打印链表的所有元素 void display(); }; #endif /* LinkList_hpp */ #include "LinkList.hpp" #include <iostream> #include <mm_malloc.h> using namespace std; LinkList::LinkList(){ head = makeNode(); tail = head; length = 0; } Node

【Java集合】LinkedList源码解析

半城伤御伤魂 提交于 2020-01-13 13:18:59
LinkedList简介 LinkedList是基于双向循环链表实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。当然同时也具备了链表的特性:插入和删除元素效率高。 LinkedList同样也是非线程安全的,只在单线程下适合使用。 同时实现了Serializable接口,因此支持序列化,能够通过序列化传输;实现了Cloneable接口,能被克隆。 源码分析 核心实现就是通过双向循环链表来对元素进行存储操作。 具体是怎么实现的,通过源代码来看一下。 主要的成员变量: //linkedList中元素个数 transient int size = 0 ; //用来表示LinkedList的头节点 transient Node < E > first ; //用来表示LinkedList的尾节点 transient Node < E > last ; //用来存储LinkedList元素的数据结构 private static class Node < E > { E item ; Node < E > next ; Node < E > prev ; Node ( Node < E > prev , E element , Node < E > next ) { this . item = element ; this . next = next ; this .

DS双向链表—祖玛

让人想犯罪 __ 提交于 2020-01-10 20:48:05
题目描述 祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。 给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。 输入 第一行是一个由大写字母'A'~'Z'组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。 第二行是一个数字n,表示玩家共有n次操作。 接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母描述,以空格分隔。其中,大写字母为新珠子的颜色。若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。 输出 输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。 如果轨道上已没有珠子,则以“-”表示。 样例输入 ACCBA 5 1 B 0 A 2 B 4 C 0 A 样例输出 ABCCBA AABCCBA AABBCCBA - A 提示 #include<iostream> #include<string> #include<cstdio> #include<cstring> using namespace std;

Redis研究-3.1 数据结构之链表

空扰寡人 提交于 2020-01-07 18:21:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我们知道,数据结构中,链表的最大好处就是能高效的实现动态增、删、改,缺点就是遍历访问比较慢,因此,在Redis中,很多功能的底层实现都是基于链表的,因为Redis是基于C语言来写的,所以只能自己实现自己的链表结构。对于一个常规的双向链表节点,我们通常使用下面的方式来定义: typedef struct Node{ void *value; struct Node *prev; struct Node *next; }Node; Redis中,在adlist.h中也是这样子定义的 typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; } listNode; 上面的node定义就是链表的每个元素了。在Redis中,同时定义了一个双向链表,并给这个链表定义了三个操作函数(方法): typedef struct list { // 表头节点 listNode *head; // 表尾节点 listNode *tail; // 节点值复制函数 void *(*dup)(void *ptr); // 节点值释放函数 void (*free)(void *ptr)

Java集合---LinkedList源码解析

﹥>﹥吖頭↗ 提交于 2019-12-26 02:32:36
Java集合---LinkedList源码解析 一、源码解析 1、 LinkedList类定义 2、LinkedList数据结构原理 3、私有属性 4、构造方法 5、元素添加add()及原理 6、删除数据remove() 7、数据获取get() 8、数据复制clone()与toArray() 9、遍历数据:Iterator() 二、ListItr 一、源码解析 1、 LinkedList类定义。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 LinkedList 是非同步的。

图解LinkedHashMap原理

泄露秘密 提交于 2019-12-20 19:03:15
1 前言 LinkedHashMap继承于HashMap,如果对HashMap原理还不清楚的同学,请先看上一篇: 图解HashMap原理 2 LinkedHashMap使用与实现 先来一张LinkedHashMap的结构图,不要虚,看完文章再来看这个图,就秒懂了,先混个面熟: LinkedHashMap结构.png 2.1 应用场景 HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了。 Map < String , String > hashMap = new HashMap < String , String > ( ) ; hashMap . put ( "name1" , "josan1" ) ; hashMap . put ( "name2" , "josan2" ) ; hashMap . put ( "name3" , "josan3" ) ; Set < Entry < String , String >> set = hashMap . entrySet ( ) ; Iterator < Entry < String , String >> iterator = set . iterator ( ) ; while ( iterator . hasNext ( ) ) { Entry entry =

数据结构 ---- 双向链表

▼魔方 西西 提交于 2019-12-15 21:49:03
双向链表 一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。 操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历链表 add(item) 链表头部添加 append(item) 链表尾部添加 insert(pos, item) 指定位置添加 remove(item) 删除节点 search(item) 查找节点是否存在 代码实现 class Node ( object ) : """双向链表节点""" def __init__ ( self , item ) : self . item = item self . next = None self . prev = None class DLinkList ( object ) : """双向链表""" def __init__ ( self ) : self . _head = None def is_empty ( self ) : """判断链表是否为空""" return self . _head == None def length ( self ) : """返回链表的长度""" cur = self . _head count = 0 while

循环链表和双向链表

时光毁灭记忆、已成空白 提交于 2019-12-05 12:15:04
package DataStructures.Lists; public class CircleLinkedList<E> { private static class Node<E> { Node<E> next; E value; private Node(E value, Node<E> next) { this.value = value; this.next = next; } } //For better O.O design this should be private allows for better black box design private int size; //this will point to dummy node; private Node<E> head; //constructer for class.. here we will make a dummy node for circly linked list implementation with reduced error catching as our list will never be empty; public CircleLinkedList() { //creation of the dummy node head = new Node<E>(null, head);