首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我们在循环链表中使用do While而不是While?

在循环链表中使用do-while循环而不是while循环的原因是为了确保至少执行一次循环体。

循环链表是一种特殊的链表,其最后一个节点指向第一个节点,形成一个环状结构。在遍历循环链表时,我们需要从第一个节点开始,一直遍历到最后一个节点,然后再回到第一个节点。

使用while循环时,循环体的执行是基于循环条件的判断结果。如果循环条件一开始就不满足,那么循环体将不会执行。而在循环链表中,我们需要至少执行一次循环体,以确保遍历到最后一个节点。

相比之下,do-while循环先执行循环体,然后再判断循环条件。这样可以保证至少执行一次循环体,即使循环条件一开始就不满足。

因此,在循环链表中使用do-while循环可以确保完整地遍历整个链表,而不会因为循环条件的判断而导致遗漏节点。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高可用、可扩展的MySQL数据库服务。产品介绍链接
  • 腾讯云云原生容器服务(TKE):提供高度可扩展的容器化应用管理平台。产品介绍链接
  • 腾讯云人工智能机器学习平台(AI Lab):提供丰富的人工智能开发工具和服务。产品介绍链接
  • 腾讯云物联网平台(IoT Hub):提供稳定可靠的物联网连接和管理服务。产品介绍链接
  • 腾讯云移动推送(TPNS):提供高效可靠的移动消息推送服务。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java 为什么不推荐 while 循环使用 sleep()

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么循环中不推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...可能会导致忙等待 // 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博主所说有很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统的一个线程...比如微服务体系,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。...比如一些用户登录场景,当用户登录状态改变时,发送登录事件进行后续处理,比如登录通知等等等待和唤醒等待和唤醒机制一般适用于等待时间较长的场景,因为等待和唤醒是一个性能消耗比较大的操作;等待时间不是很长的场景可以使用轮询机制... Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

75630

什么代码要求我们使用LocalDateTime不是Date?

作者:何甜甜在吗 来源:http://1t.click/a7Gm 项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册禁用static修饰SimpleDateFormat...通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】; java8新的时间API的使用方式,包括创建、格式化、解析、计算、...# 为什么需要LocalDate、LocalTime、LocalDateTime 1.Date如果不格式化,打印出的日期可读性差 Tue Sep 10 09:34:04 CST 2019 2.使用SimpleDateFormat...多并发情况下使用SimpleDateFormat需格外注意 SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。...calb属性设置cal c、返回设置好的cal对象 但是这三步不是原子操作 多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat

1.1K20

Leetcode No.141 环形链表

为了表示给定链表的环,我们使用整数 pos 来表示链表尾连接到链表的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表没有环。...细节 为什么我们要规定初始时慢指针在位置 head,快指针在位置 head.next,不是两个指针都在位置 head(即与「乌龟」和「兔子」的叙述相同)?...观察下面的代码,我们使用的是 while 循环循环条件先于循环体。由于循环条件一定是判断快慢指针是否重合,如果我们将两个指针初始都置于 head,那么 while 循环就不会执行。...因此,我们可以假想一个 head 之前的虚拟节点,慢指针从虚拟节点移动一步到达 head,快指针从虚拟节点移动两步到达 head.next,这样我们就可以使用 while 循环了。...当然,我们也可以使用 do-while 循环。此时,我们就可以把快慢指针的初始值都置为 head。 三、代码 /** * Definition for singly-linked list.

36320

线性表--顺序表--循环链表(五)

和单链表唯一的区别就是,尾结点指向头结点,因此循环链表没有NULL指针。...涉及遍历操作时,其终止条件就不再是像非循环链表那样判别p或p->next是否为空,而是判别它们是否等于某一指定指针,如头指针或尾指针等,链表,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点...} 至于循环链表的增删查改,都同单链表一样,我们就不在多赘述,只是遍历这块有一定小猫腻。...都 是头结点惹的祸,第一种差一个结点,第二章根本就不去,解决方法是,我们可以进循环之前,把头节点数据先输出,这样显然有点麻烦,代码看着有点笨拙,这时我们就应该想到被我们丢弃的dowhile循环。...=Phead); } 看,dowhile天然的无条件执行一次,完美的为我们解决了这个难题。 5.如何判断是否为循环链表(重点) 首先来说说这种循环链表: ?

49030

【力扣3题】快乐数&有效的字母异位词&字符串的单词数

); 那我又要问为什么不是快乐数呐?...传送门:快慢指针 这个快慢指针和链表那里判断环形链表有点像,因为本题也是可以通过判断是否有循环来解决 有人称作他为隐式链表,它们之间的next在此题用fun(n),该函数用来求每一十进制位的平方和来代替...(next是连接两个结点的枢纽,其实fun(n)函数也是本身和他平方和数之间的枢纽) 如果有循环就是就是说明这个说明快指针和慢指针某一个点会相遇 如果没有循环(平方和最后可以为1),快指针就会遇到...0; } } n = fun(n); } printf("该数是快乐数\n"); return 0; } 我想说: 快慢指针其实使用范围不局限于单链表,隐式链表同样适用。...int main() { char str[] = " can you do it?

48040

Java 基础(六):数组

循环 老生常谈的一个控制流程了,我们使用数组和集合的时候,遍历元素的时候经常会用到循环的结构,Java具有非常灵活的三种循环机制: ?...,do...while循环至少会把循环体执行一次。...日常中使用的最多的for循环,由于普通for循环可以准确的控制循环的次数,所以一般当我们需要手动控制循环次数的时候,我们使用普通for循环 for(定义初始变量;判断条件;变量变化){ 循环体...跳出循环的两个关键字 我们使用的过程,如果遇到需要中断一个流程的情况,通常会使用到以下两个关键字:break和continue。...作用是让程序立刻跳转到下一次循环的迭代。 for 循环中,continue 语句使程序立即跳转到更新语句。 while 或者 dowhile 循环中,程序立即跳转到布尔表达式的判断语句。

38030

【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)

一.了解项目功能 本次项目中我们的目标是实现一个带头双向循环链表: 该带头双向循环链表使用动态内存分配空间,可以用来存储任意数量的同类型数据......while循环的终止条件,以及switch语句的运行条件 do //使用do...while实现 { LTMenu(); scanf...因为后续我们使用的带头双向循环链表按位插入和按位删除都需要知道用户传入的链表元素链表的位置在哪,因此我们把查找链表元素位置的操作封装成一个单独的函数,后续需要查找某一链表元素的位置直接调用这个函数就行...因为我们删除链表元素前都需要先判断一下链表当前是不是为空,如果链表为空那就不要再进行删除操作了,因为尾删,头删,指定元素删除都需要判空操作,所以我们不如封装一个函数,调用时判断当前链表是否为空,......while循环的终止条件,以及switch语句的运行条件 do //使用do...while实现 { LTMenu(); scanf

17110

HashMap 底层实现原理是什么?JDK8 做了哪些优化?

JDK 1.7 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,它的组成结构如下图所示...那加载因子为什么是 0.75 不是 0.5 或者 1.0 呢?...= null); } } return null; } 从以上源码可以看出,当哈希冲突时我们需要通过判断 key 值是否相等,才能确认此元素是不是我们想要的元素。...2.HashMap 死循环分析 以 JDK 1.7 为例,假设 HashMap 默认大小为 2,原本 HashMap 中有一个元素 key(5),我们使用两个线程:t1 添加元素 key(3),t2...添加元素 key(7),当元素 key(3) 和 key(7) 都添加到 HashMap 之后,线程 t1 执行到 Entry next = e.next;时,交出了 CPU 的使用权,源码如下

38570

Java程序员面试之HashMap

介绍 JAVA的基础HashMap在工作中使用的频率极高。相信很多同学平时面试的时候经常被问到晕,今天我们来聊一下HashMap中常见的面试题吧!...java1.7HashMap是由数组+链表组成的。1.8之后加了红黑树。 当链表大于8并且容量超过64时。链表就会变成红黑树。 如图所示: ?...HashTabel为什么线程安全? HashMap是线程不安全的,Hashtable是线程安全的,因为它的所有CRUD操作都被synchronized修饰,这种实现是十分缓慢的。...HashMap死循环分析 以 JDK 1.7 为例,假设 HashMap 默认大小为 2,原本 HashMap 中有一个元素 key(5),我们使用两个线程:t1 添加元素 key(3),t2 添加元素...key(7),当元素 key(3) 和 key(7) 都添加到 HashMap 之后,线程 t1 执行到 Entry next = e.next; 时,交出了 CPU 的使用权,源码如下

29520

Python 为什么不设计 do-while 循环结构?

回答这个问题之前,让我们再仔细思考一下 do-while 语法可以解决什么问题,看看使用这种结构能带来什么好处? 最显而易见的好处是:do-while 语法保证了会先执行一遍循环体代码。...这种写法主要用在宏函数的定义,可以解决宏代码块的编译问题,使代码按照我们的意图合理分块。 另外,do {...} while (0) 结合 break 使用,还可以实现很优雅的跳转控制效果。...分析完 do-while 的好处后,让我们回到主题:Python 为什么不需要设计 do-while 循环语法呢?...expression ":" suite ["else" ":" suite] (PS.本系列的下一篇文章,我们将解释为什么 Python 要支持 while-else 语法)...也就是说,保持原 while 循环语法不变的情况下,PEP-315 提议支持 while 前面使用一个可选的 do 子句。

1.2K10

怎么样才算是精通 Python?

时间复杂度 我们都知道,Python里面list是异构元素的集合,并且能够动态增长或收缩,可以通过索引和切片访问。那么,又有多少人知道,list是一个数组不是一个链表。...写Python代码的时候,如果你需要一个链表,你应该使用标准库collections的deque, deque是双向链表。标准库里面有一个queue,看起来和deque有点像,它们是什么关系?...一个while循环或for循环中: while True: .... else: .......注意我们前面的用语,是否则,也就是说,else语句我们固有的观念,起到的作用是“否则”,是不满足条件的情况下才执行的。 我们来看Pythonwhile循环后面的else语句。...也就是说,Pythonwhile循环末尾的else换做and才是更加合适的。

2.4K91

【数据结构】C语言实现单链表万字详解(附完整运行代码)

,因此选择do...while循环语句来实现这一部分的逻辑....int swi = 0; // 创建变量swi作为do...while循环的终止条件,以及switch语句的运行条件 do // 使用do...while实现单链表循环使用 {...因为后续我们使用的单链表按位插入和按位删除都需要知道用户传入的链表元素链表的位置在哪,因此我们把查找链表元素位置的操作封装成一个单独的函数,后续需要查找某一链表元素的位置直接调用这个函数就行....注意,查找只需要遍历链表,不需要改变链表内容,因此我们传给函数链表的一级头指针即可,函数的参数还应该接收待查找的结点的数据域,以便我们遍历链表的过程能够找到它.......while循环的终止条件,以及switch语句的运行条件 do //使用do...while实现 { SLTMenu(); scanf

31410

Java高频面试之集合篇

2个子链表 do { // 为了while条件中用 next =...为了利用&运算计算节点在数组的下标 HashMap 多线程死循环问题? HashMap 的 get 方法能否判断某个元素是否 map ?...&运算求key在数组的下标 求索引的时候为什么是:h&(length-1),不是 h&length,更不是 h%length h%length 效率不如位运算快 h&length hash碰撞多,会导致...0.75,并且不推荐我们修改 为什么加载因子的默认值是 0.75,并且不推荐我们修改 如果loadFactor太小,那么map的table需要不断的扩容,扩容是个耗时的过程 如果loadFactor...太大,那么maptable放满了也不不会扩容,导致冲突越来越多,解决冲突而起的链表越来越长,效率越来越低 0.75 这是一个折中的值,是一个比较理想的值

6010

算法与数据结构(二):链表

链表的每个节点在内存不是连续的,所以它不能像数组那样根据下标来访问(当然可以利用C++的运算符重载来实现使用下标访问),链表的每一个节点都保存了下一个节点的地址,所以我们根据每个节点指向的下一个节点来依次访问每个节点...链表的每个节点都是堆上分配的,不再使用的时候需要手工清除每个节点。...链表中找到比新节点值更大的节点,这种情况下,链表插入 但是代码并没有考虑到尾部插入的情况,由于尾部插入时,r等于尾节点,r->pNext 的值为NULL, 所以 p->pNext = r-...循环链表 循环链表是建立单向链表的基础之上的,循环链表的尾节点并不指向空,而是指向其他的节点,可以是头结点,可以是自身,也可以是链表的其他节点,为了方便操作,一般将循环链表的尾节点的next指针指向头节点...根据这种情形我们可以考虑使用这样一种办法:定义两个指针,一个一次走两步也是就是p = p->next->next, 一个慢指针一次走一步,也就是q = q->next,如果是循环链表,那么快指针某个时候一定会领先慢指针一周

58720

java多线程并发之旅-14-lock free queue 无锁队列

= TRUE); //如果没有把结点链尾指针上,再试 CAS(tail, p, q); //置尾结点 } 我们可以看到,程序的那个 do- while 的 Re-Try-Loop。...你会看到,为什么我们的“置尾结点”的操作(第12行)不判断是否成功,因为: 如果有一个线程T1,它的while的CAS如果成功的话,那么其它所有的 随后线程的CAS都会失败,然后就会再循环,...不是整个数据结构。 无锁队列的改良版本 V1.0.0 上面的文章给出了一种链表无锁队列的实现。其中对ABA和double CAS等现象都进行了分析。...LockFreeQueue,所有的线程都是对资源进行申请后再使用,一个线程若申请到了资源(这里的资源主要指环形队列的内存槽位),就会立即使用,并且使用完后释放掉该资源。...当队列中有元素时,A总能申请到这个元素并且执行到弹出操作,B则只能在DeQueue函数的while循环中一直循环下去。 一些优化 对LockFreeQueue可以进行一些优化。

77710

一文吃透hashmap的前世与今生

:对于链表的新增,删除等操作(找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),查找操作需要遍历链表逐一进行比对,复杂度为O(n) 3.二叉树:对一棵相对平衡的有序二叉树,对其进行插入..., //因为立即删掉的是it迭代器的,第二次循环进入后重新获取长度,这也是 //为什么使用迭代器删除的原因 System.out.println(map.toString...如果数组长度小于最小树化容量(默认数组大小为64时),则优先使用数组扩容,不是采用转换红黑树节点 if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY...= null) hd.treeify(tab); } } 树化方法有一个很关键的点 如果数组长度小于最小树化容量(默认数组大小为64时),则优先使用数组扩容,不是采用转换红黑树节点...将会让数组的长度扩大至当前容量的2倍,数组与链表上的节点进行重新hash计算,使用尾插法的形式,避免了resize的过程JDK1.7Hashmap中会出现的环形链表情况。

24920

HashMap详解

直接插然后下移只要一句代码尾插需要遍历。所以我们jdk1.7当中是的确使用的头插法,但在1.8之后修改成尾插法下面会提。...因此while里面就是遍历链表的元素赋值给e,判断e是否为空当前e是sec,再进行同样的操作(定位,头插,移位) ?...到这一步问题就来了,处理完first之后现在e引用sec,再次while循环 得next = e.next。现在e.next = first不是null,就出现循环了。...导致接下来e 不是null,是first。然后再进while循环e =first,next=null。这时first就要插在sec上就是first的next改为sec。就形成了死循环 ?...JDK8的优化 resize 扩容优化 解决了resize时多线程死循环问题 引入了红黑树,目的是避免单条链表过长影响查询效率 关于resize优化,1.7上面扩容源码里拿到元素重新类似取模运算h

50830

Redis 6.0 IO线程功能分析

读者可能会问,为什么处理命令不在 IO线程 进行,我觉得主要有两个原因: 如果处理命令 IO线程 进行,那么就会涉及到竞争的问题。...所以,为了稳定性,继续使用单线程执行命令是最好的选择。 为什么使用多线程呢?主要为了使用多核CPU的优势,下面是使用多线程的测试数据(数据来源网络): ? ?...# 设置IO线程数 Redis 启动时会根据配置文件设置的 IO线程 数来启动 IO线程,启动 IO线程 函数 initThreadedIO() 完成,代码如下: void initThreadedIO...,并且设置客户端连接的 CLIENT_PENDING_READ 标志位,表示当前连接已经 clients_pending_read 链表,防止二次添加。...但这里要吐槽一下的是,等待 IO线程 读取客户端请求时,居然用了一个死循环来等待,这样有可能会导致CPU使用率飙升的问题,有可能影响其他服务的运行(不知道作者怎么想的)。

93520
领券