算法刷题之路之链表初探(一)
今天来学习的算法题是leecode141环形链表,是一道简单的入门题,话不多说!直接上!
条件
项目解释
有题目可以知道,我们需要判断链表中是否存在环,其实也是说链表的next指针指向了之前只想过的node,所以我们可以从过程出发,使用循环来遍历链表中的每一条数据,来完成题目
根据题目的要求我们可以选用Set集合(可以自动去重),在遍历的过程中,将每一个node加入数组中,随后将指针指向下一个node,当向set中添加数据的操作报错时,证明出现了环。
代码
public boolean hasCycle(ListNode head) {
//判断环形链表(使用HashSet完成)
//set是无序的!!!
HashSet<ListNode> listNodes = new HashSet<>();
while (head != null){
//因为Set是去重的,当Set中元素与循环得到的链表元素相等时,返回ture说中此时有环行链表出现
if(!listNodes.add(head)){
return true;
}
head = head.next;
}
return false;
优化方向
众所周知,在Java中要遍历每一个链表是非常消耗资源的,与此同时判断环的经典解决方法就是快慢指针,那我们是不是可以使用快慢指针呢??
废话,这么简单的题,当然可以啦!!!
代码
public static class Solution {
public boolean hasCycle(ListNode head) {
//判断环形链表(使用HashSet完成)
//set是无序的!!!
HashSet<ListNode> listNodes = new HashSet<>();
while (head != null){
//因为Set是去重的,当Set中元素与循环得到的链表元素相等时,返回ture说中此时有环行链表出现
if(!listNodes.add(head)){
return true;
}
head = head.next;
}
return false;
/**
* 使用快慢指针,判断更加快速
*
* if(head==null||head.next==null){
* return false;
* }
*
* ListNode fast = head.next;
* ListNode slow = head;
*
* while (fast != slow){
* if(fast ==null||fast.next==null){
* return false;
* }
* slow = slow.next;
* fast = fast.next.next;
* }
* return true;
*/
}
}
测试
import java.util.HashSet;
public class Leecode141 {
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public static class Solution {
public boolean hasCycle(ListNode head) {
//判断环形链表(使用HashSet完成)
//set是无序的!!!
HashSet<ListNode> listNodes = new HashSet<>();
while (head != null){
//因为Set是去重的,当Set中元素与循环得到的链表元素相等时,返回ture说中此时有环行链表出现
if(!listNodes.add(head)){
return true;
}
head = head.next;
}
return false;
/**
* 使用快慢指针,判断更加快速
*
* if(head==null||head.next==null){
* return false;
* }
*
* ListNode fast = head.next;
* ListNode slow = head;
*
* while (fast != slow){
* if(fast ==null||fast.next==null){
* return false;
* }
* slow = slow.next;
* fast = fast.next.next;
* }
* return true;
*/
}
}
public static void main(String[] args) {
// Example 1: No cycle
ListNode head1 = new ListNode(1);
head1.next = new ListNode(2);
head1.next.next = new ListNode(3);
head1.next.next.next = new ListNode(4);
head1.next.next.next.next = null; // No cycle
System.out.println("Has cycle in Example 1: " + new Solution().hasCycle(head1));
// Example 2: Cycle exists
ListNode head2 = new ListNode(1);
head2.next = new ListNode(2);
head2.next.next = new ListNode(3);
head2.next.next.next = new ListNode(4);
head2.next.next.next.next = head2.next; // Cycle: 4 -> 2
System.out.println("Has cycle in Example 2: " + new Solution().hasCycle(head2));
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}