链表

Redis ZSet (5)

流过昼夜 提交于 2020-03-13 00:05:45
存储类型 ZSet集合基本与Set相同,只是多了一个数值类型属性score,score相同时,按照Key的ASC码排序。 数据结构对比 数据结构 是否允许重复 是否有序 有序实现方式 List 是 是 索引下标 Set 否 否 无 ZSet 否 是 score属性 # 无序插入 127.0.0.1:6379> zadd lzset 20 c 30 d 10 b 1 a (integer) 4 # 获取数据是有序的 127.0.0.1:6379> zrange lzset 0 -1 withscores 1) "a" 2) "1" 3) "b" 4) "10" 5) "c" 6) "20" 7) "d" 8) "30" 存储(实现)原理 同时满足以下条件时使用ziplist编码: 元素数量小于128个 所有member的长度都小于64字节 在ziplist的内部,按照score排序递增来存储。插入的时候要移动之后的数据。 redis.conf配置 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 超过阈值之后,使用skiplist+dict存储。 什么是skiplist? 下边是普通的有序列表 在这样一个链表中,如果我们要查找某个数据,那么需要从头开始逐个进行比较,直到找到包含数据的那个节点

Java数据结构与算法-单链表 新浪,腾讯面试题详解

放肆的年华 提交于 2020-03-12 17:24:52
单链表常见的几个面试题 新浪,腾讯内部面试题目 题目分析 代码实现 测试用例 一,面试题目 统计链表中 有效节点 的个数(不含 头结点 )【新浪】 获取链表中倒数第 K 个元素【新浪】 单向链表的 逆转 【腾讯】 二,题目分析 第一题:我们可以获取链表的头结点后,然后进行 遍历 ,设置一个变量进行计数, 注意不要算上头结点 。 第二题:我们可以在第一题的基础上,在获取到了链表的长度后,只需要考虑倒数第K个节点是从前面开始第几个节点,我们就循环几次不就可以了?注意如果你的下标从 0 开始循环那就 size - k 就可以了,如果你是从 1 开始的那么就 size-k+1 就可以了。 第三题:我们需要创建一个新的头结点,然后把原来的那个节点从前往后依次放到新节点的后面,注意是newHeadNode.next始终等于新加入的那个元素;核心代码就是: oldNode.next = newHeadNode.next;newHeadNode.next = oldNode ;就是这样移动,最后在把新的节点后的元素指向原来头结点: oldHeadNode = newHeadNode; 图解如下: 三,代码实现 第一题 //统计出有效的节点个数,不含头结点。 public static int getLength ( HeroNode headHeroNode ) { int count = 0 ;

用C#解决LeetCode环形链表

一世执手 提交于 2020-03-12 17:12:49
题目 思路 定义快、慢两个指针,遍历链表; 如果链表中不存在环,快指针会先到达尾部,返回false; 如果链表中最终未发现快指针与慢指针不相同,返回true。 代码块 /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public bool HasCycle ( ListNode head ) { if ( head == null || head . next == null ) { return false ; } ListNode slow = head ; ListNode fast = head . next ; while ( slow != fast ) { if ( fast == null || fast . next == null ) { return false ; } slow = slow . next ; fast = fast . next . next ; } return true ; } } 运行结果 来源

合并k个排序链表

十年热恋 提交于 2020-03-12 09:47:10
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 思路: 两个两个组合,排序 使用递归 使用递归就要找截止条件(当节点为null) /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeKLists ( ListNode [ ] lists ) { //当长度为0 就是没有链表 if ( lists . length == 0 ) { return null ; } //当长度为1 只有一个单链表 不用排序 直接返回 if ( lists . length == 1 ) { return lists [ 0 ] ; } //当长度为2 将这两个链表直接排序 if ( lists . length == 2 ) { return mergeTwoLists ( lists [ 0 ] , lists [ 1 ] ) ; } //将数组分成两部分 int

数据结构与算法复习笔记一

倾然丶 夕夏残阳落幕 提交于 2020-03-12 08:56:30
一.基本数据结构 1.数组、字符串 优点: 构建一个数组非常简单 能让我们在O(1)的时间里根据数组下标查询某个元素 缺点: 构建时必须分配一段连续的空间 查询、删除、添加某个元素时须遍历整个数组 2.链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。 双链表:双链表的每个结点中都含有两个引用字段。 优点:灵活分配空间 缺点:查询元素需要O(n)时间 解题技巧: 利用快慢指针(有时需要三个指针) 加链表头 例如: 两个排序链表进行整合排序 将链表的奇偶数按原定顺序分离,生成前半部分为奇数,后半部分为偶数的链表 3.栈 特点:后进先出 算法基本思想: 可以用一个单链表实现 只关心上一次操作 处理完上一次操作后,能在O(1)时间内查找到更前一次的操作。 4.队列 特点:先进先出 双链表实现 常用场景: 广度优先搜索 5.树 特点:结构直观 常考算法:递归 常考树的形状: 普通二叉树 平衡二叉树 完全二叉树 二叉搜索树 红黑树 树的遍历应用场景: 前序遍历:多应用于树的创建和搜索 中序遍历:二叉搜索树 后序遍历:在对某个节点进行分析的时候,需要来自左子树和右子树的信息。 二.高级数据结构 1.优先队列 与普通队列区别: 保证每次取出的元素是队列中优先级最高的 优先级别可自定义 常用场景: 从杂乱无章的数据中按照一定的顺序(或优先级

什么是图?

拥有回忆 提交于 2020-03-12 06:28:16
什么是图呢? 直观的理解图的美貌 图的基本术语 如何去表示图呢? 声明 :本次写的文章属于系列文章,主要介绍数据结构中的图的使用、应用场景、以及算法实现。本系列文章会围绕下面的结构来写,本篇文章首先介绍《什么是图?》《如何去表述图?》。 什么是图呢?学习过数据结构的童鞋肯定早有耳闻,但是多数又是望而却步。通常大家都会惧怕自己不清楚的知识,直觉的会感觉这个不会的东西会特别复杂,同样,我也不例外。这个时候,谁能抵制住这个直觉,就会先人一步啦。呀呀,怎么开始抒情了,注意…正片开始!!! 直观的理解图的美貌 每个人城里人都有微信, 像我这种村里的可能没有 ,闭上眼试想,你的好友 列表里有你的虎妈、严爸、女朋友,你的女朋友的好友列表里有你妈、你爸、你和老王。这样的关系,用线连接在一起,就构成了 多对多的朋友关系网 ,这个关系网就是数据结构当中的 图(Graph) 。 再比如你去坐地铁, 村里人也是坐不上地铁的 ,买卡的时候,你会看到显示器上犬牙交错的地铁线路,这样的交通网络,也是数据结构中的图。 图的基本术语 什么是顶点和边呢 ?官方说法:在图中,最基本的单元是 顶点(vertex) ,相当于树中的节点。顶点之间的关联关系,被称为 边(edge) 。如果不理解,你可以这样想,你、你女朋友,还有老王,都作为关系网中的顶点,你女朋友和老王的关系,可以看做边。 什么是带权图、无权图

HashMap实现原理分析

别说谁变了你拦得住时间么 提交于 2020-03-12 05:55:12
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难; 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表 的特点是:寻址困难,插入和删除容易。 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。   哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“ 链表的数组 ” ,如图:   从上图我们可以发现哈希表是由 数组+链表 组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。   HashMap其实也是一个线性的数组实现的

数据结构与算法——删除排序表中的重复元素

与世无争的帅哥 提交于 2020-03-12 02:31:02
题目 解题 设置两个节点newhead,newnext,newnext用于遍历链表中的所有元素,newhead通过判断newhead.val与newnext.val是否相等,指向不重复的元素,达到删除重复元素的效果。 注意遍历结束后要将newhead.next=null,否则若原链表最后两个元素相等,删除后的新链表会保留该重复元素。 public ListNode DeleteDuplicates ( ListNode head ) { if ( head == null || head . next == null ) { return head ; } ListNode newhead = head ; ListNode newnext = head . next ; while ( newnext != null ) { if ( newhead . val != newnext . val ) { newhead . next = newnext ; newhead = newnext ; } newnext = newnext . next ; } newhead . next = null ; return head ; } 来源: CSDN 作者: Leeyayai 链接: https://blog.csdn.net/qq_44425179/article

LeetCode 141. 环形链表 (Java)

我是研究僧i 提交于 2020-03-12 02:07:19
环形链表 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 知识点:Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。 思路:新建一个hash表,将每个节点放入hash表中,如果出现重复,则证明有环 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public boolean hasCycle ( ListNode head ) { /

求助c语言单链表操作问题

佐手、 提交于 2020-03-12 02:02:05
这里是刚学习数据结构的小白,有个问题想请教一下。 //结构体声明 typedef struct Node { ElemType data ; struct Node * next ; } Node , * LinkList ; //初始化单链表 void InitList ( LinkList * L ) { * L = ( LinkList ) malloc ( sizeof ( Node ) ) ; ( * L ) -> next = NULL ; } LinkList 本来就是一个结构体指针 这里为什么用LinkList *L 我将程序写成 void InitList(LinkList L){ L=(LinkList) malloc(sizeof(Node)); L->next=NULL; } 他会出现报错 包括写逆置算法的时候也用到了 来源: CSDN 作者: weixin_45840488 链接: https://blog.csdn.net/weixin_45840488/article/details/104802990