单向链表

集合知识汇总

。_饼干妹妹 提交于 2020-01-31 11:03:42
实际开发中,经常用到的 ArrayList、LinkedList、HashMap、LinkedHashMap 等集合类,其实涵盖了很多数据结构和算法,每个类可以说都是精华,今天和大家一起来梳理一下! 一、摘要 在 Java 中,集合大致可以分为两大体系,一个是 Collection,另一个是 Map,都位于java.util包下。 Collection :主要由 List、Set、Queue 接口组成,List 代表有序、重复的集合;其中 Set 代表无序、不可重复的集合;Java 5 又增加了 Queue 体系集合,代表队列集合。 Map:则代表具有映射关系的键值对集合。 很多书籍将 List、Set、Queue、Map 等能存放元素的接口体系,也归纳为容器,因为他们可以存放元素! 集合和容器,这两者只是在概念上定义不同,比如ArrayList是一个存放数组的对象,真正用起来并不会去关心这个东西到底是集合还是容器,把东西用好才是关键! java.util.Collection下的接口和继承类关系简易结构图: https://imgconvert.csdnimg.cn

数据结构基础温故-1.线性表(下)

痴心易碎 提交于 2020-01-25 04:39:08
在 上一篇 中,我们了解了单链表与双链表,本次将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。 一、循环链表基础 1.1 循环链表节点结构   循环链表和单链表的主要差异就在于 循环的判断条件 上,原来是判断p.next是否为空,现在则是p.next不等于头结点,则循环未结束。 1.2 循环链表的O(1)访问时间   在单链表中,有了头结点,我们可以在O(1)时间访问到第一个节点,但如果要访问最后一个节点却需要O(n)的时间,因为我们需要对整个链表进行一次遍历。在循环链表中,我们可以借助尾节点来实现,即不用头指针,而是 用指向终端结点的尾指针来表示循环链表 ,这时候无论是查找第一个节点还是最后一个节点都很方便,可以控制在O(1)的时间内,如下图所示。   从上图中可以看到,终端结点用尾指针(tail)指示,则查找终端结点是O(1),而开始结点,其实就是tail.Next,其时间复杂也为O(1)。由此也可以联想到,在合并两个循环链表时,只需要修改两个链表的尾指针即可快速地进行合并。 二、循环链表实现 2.1 循环链表节点的定义实现 public class CirNode<T> { public T Item { get; set; } public

单向链表

白昼怎懂夜的黑 提交于 2020-01-24 20:54:42
特点: 插入快删除快 相较于数组 不需要扩容 ,因为他在内存中不是连续的空间 查询和 public class MyLinkedList<E> implements MyList<E> { Node hand = null; class Node { Node next = null; E obj;//保存的数据 public Node(E obj) { this.obj = obj; } } @Override public int size() { int size = 0; Node var1 = hand; while (var1 != null) { size++; var1 = var1.next; } return size; } @Override public boolean add(E obj) { Node node = new Node(obj); if (hand == null) { hand = node; return true; } //从根节点开始,找到下个节点为空的对象 Node var1 = hand; while (var1.next != null) { var1 = var1.next; } //关联数据 var1.next = node; return true; } @Override public boolean remove(E

单向环形链表及约瑟夫问题的java实现

时光毁灭记忆、已成空白 提交于 2020-01-21 03:18:59
约瑟夫问题(Josephu问题)也称为“丢手帕问题”。 问题描述: 设编号为1、2、3、4......的n个小朋友围成一圈,约定编号为 k 的小朋友从 1 开始报数,轮流数到 m 的小朋友出列。接着出列小朋友的下一位又从1开始报数,轮流数到 m 的小朋友出列,以此类推,直到所有小朋友都出列为止,由此产生一个出列编号的序列。 n = 5 表示有 5 个小朋友 ; k = 1 表示从第 1 个小朋友开始报数 ; m = 2 表示每次数 2 下。 本问题由于需要不断地删除节点,同时循环报数,因而用到单向环形链表。 首先创建一个节点类Boy : class Boy{ private int no ; //小孩的编号 private Boy next ; //指向下一个节点,默认为null public Boy(int no){ this.no = no ; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public Boy getNext() { return next; } public void setNext(Boy next) { this.next = next; } /* * 之所以要设置这几个构造方法,是因为Boy的几个基本属性都是private类型 */ }

python实现单向链表

安稳与你 提交于 2020-01-19 16:05:41
# 节点类 class Node: def __init__(self, data, next=None): self.data = data self.next = next def __str__(self): return str(self.data) # 链表类 class LinkedList: def __init__(self): self.head = None self.length = 0 # 链表尾部append数据 def append(self, data): node = Node(data) if self.head is None: # head 未空,则此时链表为空,直接将新节点赋给self.head self.head = node else: # head 不为空 current = self.head index = 0 while current.next: # 当前元素的下个元素是否为空 current = current.next current.next = node self.length += 1 # 某一位置插入节点 def insert(self, pos, data): if pos < 0 or pos > self.length: raise IndexError new_node = Node(data) #

《程序员面试宝典》解题报告1-牛客

馋奶兔 提交于 2020-01-18 04:27:31
比较经典的一些题: 4、6、7、8、9、10、11、12、13、19、20、22、25、28、29、30 1.确定字符互异 题目描述 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。 测试样例: “aeiou” 返回:True “BarackObama” 返回:False import java . util . * ; public class Different { public boolean checkDifferent ( String iniString ) { // write code here char [ ] arr = iniString . toCharArray ( ) ; Arrays . sort ( arr ) ; for ( int i = 1 ; i < arr . length ; i ++ ) { if ( arr [ i ] == arr [ i - 1 ] ) return false ; } return true ; } } 2、原串翻转 题目描述 请实现一个算法,在不使用额外数据结构和储存空间的情况下

Java容器的常见问题

为君一笑 提交于 2020-01-07 09:24:06
记录Java容器中的常见概念和原理 参考: https://github.com/wangzhiwubigdata/God-Of-BigData#%E4%B8%89Java%E5%B9%B6%E5%8F%91%E5%AE%B9%E5%99%A8 https://blog.csdn.net/justloveyou_/article/details/78653929 基础容器 ArrayList(动态数组)、LinkedList(带头结点的双向链表) ArrayList public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 默认初始容量为 10; 扩容机制:添加元素前,先检查是否需要扩容,一般扩为源数组的 1.5 倍 + 1; 边界检查(即检查 ArrayList 的 Size):涉及到 index 的操作; 调整数组容量(减少容量):将底层数组的容量调整为当前列表保存的实际元素的大小; 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理; LinkedList LinkedList 不但实现了List接口,还实现了Dequeue接口。因此

第一次课程设计的感受

喜你入骨 提交于 2020-01-07 00:31:41
这次课设我花费了一个礼拜的时间不断地在修改代码中的漏洞,一开始对于单向链表的不熟悉,通过查找书籍和观看李戈老师的视频,对于单向链表有了初步的认识,然后开始编写简易编辑器的代码,在写了几百行的代码后由于对于单向链表的认识度不够深,起初出现了许多的bug,花费了大量的精力和时间去修改bug,终于可编译成功运行后,但是运行结果却达不到预期中的结果,代码的繁杂也让我感到十分浮躁,距离课设提交的时间越来越近,舍友们也相继熬夜打起代码,后来我尝试重新建立新的项目,重新根据课题编写各段的功能代码,不断地测试运行数据,当各段代码的大体功能实现以后,接下来便是不断测试代码,增加运行结果中的用户交互良好性,在这个过程中代码的bug不断地在修改,然而提交课设过程中还是有不少问题,事后又进行了一番修改,总体上我觉得在这次课设中还是学到了不少东西,一方面对单向链表的深入学习,另一方面对文件的使用,以及对复杂问题的解决办法。希望以后每一次做事之前都能保持耐心。 来源: https://www.cnblogs.com/gg081700/p/12159048.html

【图论】2 图的建立与遍历

最后都变了- 提交于 2020-01-01 12:25:44
在c++中我们应如何表示一张图呢? 表示完成后又应如何调用呢? 1.图的建立 我们有许多方法存住一张图,在csp-s考试范围常用的方法有:   1.邻接矩阵  2.数组模拟链表(前向星)   (当然还有许多其他方法) 邻接矩阵 理解很简单: 对于一个二维数组 a [i] [j],a [i] [j]的值即为 点 i 到点 j 的边的边权。 就是说我们总是将 从i 到 j 的单向边的边权赋给 用以存这个边的二维数组的对应位置 来源: https://www.cnblogs.com/rtrtrt/p/12128617.html

数据结构与算法(三)--单向链表

自闭症网瘾萝莉.ら 提交于 2019-12-27 17:33:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。 相比较普通的线性结构,链表结构的优势是什么呢?我们可以总结一下: (1)单个节点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 (2)节点的删除非常方便,不需要像线性结构那样移动剩下的数据 (3)节点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表 那么在实际应用中,链表是怎么设计的呢?我们可以以int数据类型作为基础,设计一个简单的int链表: (1)设计链表的数据结构 typedef struct _LINK_NODE { int data; struct _LINK_NODE* next; }LINK_NODE; (2)创建链表 LINK_NODE* alloca_node(int value) { LINK_NODE* pLinkNode = NULL; pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE)); pLinkNode->data = value; pLinkNode->next =