力扣刷题日记(链表)

链表(LinkedNode)

判断链表是否有环

哈希表:

将访问过的链表节点记录下来,如果该节点之前访问过,则直接返回有环,否则继续遍历
bool hasCycle(ListNode *head) {
	unordered_set<ListNode*> temp;
	while(head != nullptr){
		if(temp.count(head)){
			return true;
		}
		else[
			temp.insert(head);
			head = head -> next;
		]
	}
	return false;
}

Floyd算法:

又称龟兔赛跑算法,用快慢指针遍历整个数组,如果指针碰撞,则说明有环,如果都遍历到了空指针,说明没有环路

代码

bool hasCycle(ListNode* head){
	if (head == nullptr || head->next == nullptr) {
        return false;
    }
	ListNode* slow = head;
	ListNode* fast = head -> next;
	while(slow != fast){
		if(fast == nullptr || fast -> next == nullptr)
			return false;
		slow = slow -> next;
		fast = fast -> next -> next;
	}
	return true;
}
上一篇:[C/C++ 基础](类型转换系列三) dynamic_cast与std::dynamic_pointer_castcast


下一篇:2021-10-01