备案的域名做电影网站吗,wordpress写的软文,广告设计与制作软件有哪些,关于网站建设的英文歌给你一个链表的头节点 head #xff0c;判断链表中是否有环。
如果链表中有某个节点#xff0c;可以通过连续跟踪 next 指针再次到达#xff0c;则链表中存在环。 为了表示给定链表中的环#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置#xff08;…给你一个链表的头节点 head 判断链表中是否有环。
如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。注意pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 则返回 true 。 否则返回 false 。 示例 1 输入head [3,2,0,-4], pos 1
输出true
解释链表中有一个环其尾部连接到第二个节点。示例 2 输入head [1,2], pos 0
输出true
解释链表中有一个环其尾部连接到第一个节点。示例 3 输入head [1], pos -1
输出false
解释链表中没有环。
解题思路
看到这个题我只想着可以用链表的知识来解决但完全不知道该怎么下手。所以去看了链表的知识
链表
链表是一种逻辑相连但物理上不一定相连的存储结构是由每一格节点组成该节点包含val,和next,其中val存放该节点的值next是一个索引指向下一个节点
如何创建一个新的空链表: LinkNode headnew LinkNode(); head.nextnull; (LinkNode是一个节点 解题一
所以这个题应该如何使用链表来解决呐
这里我们介绍Floyd判圈算法龟兔赛跑算法
假想「乌龟」和「兔子」在链表上移动「兔子」跑得快「乌龟」跑得慢。当「乌龟」和「兔子」从链表上的同一个节点开始移动时如果该链表中没有环那么「兔子」将一直处于「乌龟」的前方如果该链表中有环那么「兔子」会先于「乌龟」进入环并且一直在环内移动。等到「乌龟」进入环时由于「兔子」的速度快它一定会在某个时刻与乌龟相遇即套了「乌龟」若干圈。链接https://leetcode.cn/problems/linked-list-cycle/solutions/440042/huan-xing-lian-biao-by-leetcode-solution/ 来源力扣LeetCode
在该题中我们可以创建两个指针分别是快慢指针fast和slow,在刚开始我们设置slow指向head,fast指向head.next即慢指针指向第一个节点快指针指向第二个节点fast一次移动两格慢指针一次移动一格所以若在后面的循环过程中快慢指针相遇则表明该链表存在环那么如何来判断该链表无环呐我们在这里可以设置一个循环while(slow!fast) 若fast指向空即fast指向链尾则表明该链表无环
在这里我们来需要注意因为在刚开始我们要去创建快慢指针一个指向第一个节点一个指向第二个节点为了防止出现空指针异常的情况我们还需要对第一个节点和第二个节点捷星判断若为空则直接返回false即或此时空链表或者只有一个节点的聊表是不可能存在环的
if(headnull ||head.nextnull) //判断该链表是否为空链表或者只有一个节点的链表这两种情况是不可能存在环的return false;LinkNode slowhead;
LinkNode fasthead.next; //创建快慢指针while(slow!fast)
{if(fastnull || fast.nextnull) //如果此时fast指针指向链表尾或者fast所指节点的后一个节点是链表尾因为fast一次移动两格则表明该链表无环return false;slowslow.next;fastfast.next.next;//移动快慢指针
}return true; //说明此时slowfast
解题二
看到还有另外一种解法就是去遍历整个链表。首先创建一个容器每遍历一个节点先看容器中是否包含该节点若不包含则将该节点加入到容器中继续遍历下一个节点直到链表为空若包含则说明该链表存在环返回true
那么该容器该如何选择在这里我们选择哈希集合
哈希集合
HashSet是一个没有重复元素的集合Set集合是不允许出现重复元素的
初始化 HashSet类型 集合名 new HashSet();
添加集合名.add(元素);
删除集合名.remove(元素);
判断是否包含某元素集合名.countains(元素);
判断是否为空集合名.isEmpty();
获取大小集合名.size();
获取所有元素 可以使用for for(类型 s集合名{} 可以使用迭代器Iterator it集合名.iterator; while(it.hashNext){} (s和it是我这里随便起的名称) HashSetLinkNode hashnew HashSet();//创建一个哈希集合while(head!null)
{if(hash.contains(head)) //如果哈希集合中包含了head节点return true;hash.add(head);headhead.next;
}
retrun false; //已经遍历完该链表没有环 想再写一点hashset和hashmap的区别
HashMap是基于键值对key-value pair的存储结构每个元素都有一个key和一个对应的valueHashSet是基于哈希表hash table的存储结构只存储元素的值
HashMap中的key是唯一的不允许重复HashSet中的元素也是唯一的不允许重复
HashMap通过使用key来访问value所以可以通过key快速查找、插入和删除元素HashSet只能通过元素的值来访问和操作集合具有快速查找、插入和删除元素的特性。
原文链接HashMap与HashSet的区别_hashset hashmap区别-CSDN博客