携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
前言
之前小六六一直觉得自己的算法比较菜,算是一个短板吧,以前刷题也还真是三天打鱼,两台晒网,刷几天,然后就慢慢的不坚持了,所以这次,借助平台的活动,打算慢慢的开始开刷,并且自己还会给刷的题总结下,谈谈自己的一些思考,和自己的思路等等,希望对小伙伴能有所帮助吧,也可以借此机会把自己短板补一补,希望自己能坚持下去呀
链表
- 六六力扣刷题链表之移除链表元素
- 六六力扣刷题链表之反转链表
- 六六力扣刷题链表之两两交换链表中的节点
- 六六力扣刷题链表之合并两个有序链表
- 六六力扣刷题链表之反转链表 II
- # 六六力扣刷题链表之分隔链表
链表的理论基础
链表的种类主要为:单链表,双链表,循环链表 链表的存储方式:链表的节点在内存中是分散存储的,通过指针连在一起。 链表是如何进行增删改查的。 数组和链表在不同场景下的性能分析。 可以说把链表基础的知识都概括了,但又不像教科书那样的繁琐。
虚拟头结点
链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个
题目
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
输入: head = [3,2,0,-4], pos = 1
输出: true
解释: 链表中有一个环,其尾部连接到第二个节点。
答案
package com.six.finger.leetcode.two;
import com.six.finger.leetcode.common.ListNode1;
import java.util.HashSet;
import java.util.Set;
public class HasCycle1 {
public static void main(String[] args) {
ListNode1 listNode1 = new ListNode1(1);
hasCycle(listNode1);
}
public static boolean hasCycle(ListNode1 head) {
Set<ListNode1> set=new HashSet<>();
while (head!=null){
if (set.contains(head)){
return true;
}else {
set.add(head);
}
head=head.next;
}
return false;
}
}
第二个方法
快慢指针
/*
快慢指针
*/
public static boolean hasCycle1(ListNode1 head) {
if (head == null || head.next == null) {
return false;
}
ListNode1 slow = head;
ListNode1 fast = head.next;
while (fast != slow) {
if (fast == null || fast.next == null) {
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
结束
其实这题很简单,一个就是set,一个就是快慢指针,也就是我们说的龟兔赛跑的例子 好了,今天这个链表的题就到这了,我们明天再见,我是小六六,三天打鱼,两天晒网!