leetcode之141环形链表Golang

判断一个链表中是否存在环,那么很明显的就是想到了快慢双指针的方式,快指针每次向后走两步,慢指针每次向后走一步,也就是说每次快指针比慢指针多走一步,那么如果链表中存在环,那么必定再某一次移动的时候快慢指针相遇,如果链表中不存在环,那么也就是快指针的下一步为nil。

我在golang中定义存在环的链表还出现了问题,哈哈,如下:

    // 我先声明了一个变量,也就是结点node3
    var node3 *ListNode
    node1 := &ListNode{
        Val:  1,
        // 然后这里直接让node1的Next指向node3,但是此时node3只是一个变量名,它的值其实为nil
        Next: node3,
    }
    node2 := &ListNode{
        Val:  2,
        Next: node1,
    }
    // 此时node3才是真正指向了一个内存地址
    node3 = &ListNode{
        Val:  3,
        Next: node2,
    }
    node4 := &ListNode{
        Val:  4,
        Next: node3,
    }
    node5 := &ListNode{
        Val:  5,
        Next: node4,
    }
// 此时的链表并没有成环
// 所以其实需要在后面让node1.Next=node3,指向node3的真正的地址
    node1.Next=node3

  

算法代码如下:

func hasCycle(head *ListNode) bool {
    // 没有结点或者只有一个结点,不可能是环形链表
    if head == nil || head.Next == nil {
        return false
    }
    // 定义双指针,一个每次向前走两步,一个每次向前走一个,当快指针等于nil的时候说明不存在环,当快指针等于慢指针的时候,表示存在换
    slow, fast := head, head
    for {
        for times := 0; times < 2; times++ {
            fast = fast.Next
            if fast == nil {
                return false
            }
            if fast == slow {
                return true
            }
        }
        slow = slow.Next
    }
}

  

 

posted @ 2020-09-25 15:13  胖胖咩  阅读(197)  评论(0)    收藏  举报