天天看點

六六力扣刷題連結清單之環形連結清單

前言

之前小六六一直覺得自己的算法比較菜,算是一個短闆吧,以前刷題也還真是三天打魚,兩台曬網,刷幾天,然後就慢慢的不堅持了,是以這次,借助平台的活動,打算慢慢的開始開刷,并且自己還會給刷的題總結下,談談自己的一些思考,和自己的思路等等,希望對小夥伴能有所幫助吧,也可以借此機會把自己短闆補一補,希望自己能堅持下去呀

連結清單

  • ​​六六力扣刷題連結清單之移除連結清單元素​​
  • ​​六六力扣刷題連結清單之反轉連結清單​​
  • ​​六六力扣刷題連結清單之兩兩交換連結清單中的節點​​
  • ​​六六力扣刷題連結清單之合并兩個有序連結清單​​
  • ​​六六力扣刷題連結清單之反轉連結清單 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;

    }
}      

第二個方法

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;      

結束

繼續閱讀