美文网首页
0141-环形链表

0141-环形链表

作者: liyoucheng2014 | 来源:发表于2019-01-15 11:48 被阅读0次

环形链表

解题方法

  1. 给定一个时间,无限循环,判断是否存在空
  2. 利用Set(集合),遍历过程判判断此节点是否在Set中,不在的话,就把此节点加到Set中
  3. 利用快慢指针

方案一


只需要设两个指针,一个每次走一步的慢指针和一个每次走两步的快指针,如果链表里有环的话,两个指针最终肯定会相遇

借助单链表实现

C-源代码


#include <stdlib.h>
#include <stdbool.h>

#include "LinkList.h"

bool hasCycle(struct ListNode *head) {
    struct ListNode *fast = head;
    struct ListNode *slow = head;
    while (fast != NULL && fast->next != NULL) {
        fast = fast->next->next;
        slow = slow->next;
        
        if (fast == slow) {
            return true;
        }
    }
    
    return false;
}

/**
 创建环
 
 @return 环
 */
struct ListNode *create_cycle_list()
{
    struct ListNode *node1 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node1->val = 1;
    
    struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node2->val = 2;
    
    struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node3->val = 3;
    
    struct ListNode *node4 = (struct ListNode *)malloc(sizeof(struct ListNode));
    node4->val = 4;
    
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node2;
    
    return node1;
}

void test_0141(void)
{
    int arr[4] = { 1, 2, 3, 4 };
    struct ListNode *l1 = createNode(arr, sizeof(arr) / sizeof(arr[0]));
    
    struct ListNode *l2 = create_cycle_list();
    
    printf("========环形链表测试========\n");
    bool isCycle = hasCycle(l1);
    printf("是否存在环:1是,0不是=>%d\n",isCycle);
    
    bool isCycle1 = hasCycle(l2);
    printf("是否存在环:1是,0不是=>%d\n",isCycle1);
}

Swift实现

public class ListNode {
    
    public var key: Int?
    public var val: Int
    public var next: ListNode?
    public init(_ val: Int) {
        
        self.val = val
        self.next = nil
    }
}

extension ListNode: Equatable {
    
    public static func == (lhs: ListNode, rhs: ListNode) -> Bool {
        
        if let lKey = lhs.key,
            let rKey = rhs.key,
            lKey == rKey {
            
            return true
        }
        
        return false
    }
}

func hasCycle(_ head: ListNode?) -> Bool {
        
        var fast: ListNode? = head
        var slow: ListNode? = head
        while fast != nil && fast?.next != nil {
            
            fast = fast?.next?.next
            slow = slow?.next
            
            if fast == slow {
                
                return true
            }
        }
        return false
    }

参考Grandyang

相关文章

  • 0141-环形链表

    环形链表 方案一 只需要设两个指针,一个每次走一步的慢指针和一个每次走两步的快指针,如果链表里有环的话,两个指针最...

  • 0141-环形链表

    环形链表 解题方法 给定一个时间,无限循环,判断是否存在空 利用Set(集合),遍历过程判判断此节点是否在Set中...

  • 实现单向-双向环形链表

    单向环形链表 双向环形链表

  • 双指针

    一、双指针总结 1.1题目 快慢指针(主要解决链表中的问题) 141.环形链表 142.环形链表 II 876.链...

  • 02-14:leetcode重刷8之哈希与数组

    链表: 判断链表是否环形、是否回文 1、是否链表 #Definitionforsingly-linkedlist....

  • Tourist with Data Structure Seco

    链表 读题要仔细,只看题干,容易死的很惨。 设计链表 环形链表 一般环形链表使用快慢指针方式去做,快慢指针算法。参...

  • 算法(Algorithms)第4版 练习 1.3.29

    题目 使用环形链表实现队列(FIFO),环形链表也是链表,只是没有任何一个节点的链接是空的,且只有链表非空则 la...

  • 判断一个链表是否为环形链表

    判断一个链表是否为环形链表 思路:通过检测一个节点此前是否已经被访问过来判断链表是否为环形链表。 算法: 我们遍历...

  • 单项环形链表介绍和约瑟夫问题

    单项环形链表介绍和约瑟夫问题 1.单项环形链表图解 2.Josephu(约瑟夫)问题 Josephu 问题为:设...

  • 链表—环形链表

    给定一个链表,判断链表中是否有环。 分析 由于每一个父亲只有可能有一个孩子,故这里的环实际上是指list中某一个节...

网友评论

      本文标题:0141-环形链表

      本文链接:https://www.haomeiwen.com/subject/xvnedqtx.html