学习时间:
2023年1月21日
题目描述:
题解分享:
// 作 者 : 繁 华 倾 夏
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // 调用malloc函数
// 力扣(LeetCode):141. 环形链表
// Definition for singly-linked list. 单链表的定义
struct ListNode {
int val;
struct ListNode* next;
};
// head:单链表的头节点
bool hasCycle(struct ListNode* head) {
struct ListNode* slow = head, * fast = head; // 建立两个快慢指针指向头节点
while (fast && fast->next) { // 结束条件为fast或者fast->next为NULL,因为fast每次循环走两次,所以需要判断两个条件
show = slow->next; // 慢指针每循环一次
fast = fast->next->next; // 快循环每循环两次
if (fast == slow) { // 每次循环都要判断快慢指针是否相遇
return true; // 相遇即结束循环并结束函数
}
}
return false; // 不是环形链表时则结束函数
}
// 从尾部插入数据
void SListPushBack(struct ListNode** pphead, int x) {
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
newnode->val = x;
newnode->next = NULL;
if (*pphead == NULL) {
*pphead = newnode;
}
else {
// 找到尾节点
struct ListNode* tail = *pphead;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = newnode;
}
}
// 打印链表
void SListPrint(struct ListNode* phead)
{
struct ListNode* cur = phead;
while (cur != NULL) {
printf("%d->", cur->val);
cur = cur->next;
}
printf("NULL\n");
}
// 测试用例
// 输入 head = [3, 2, 0, -4], pos = 1
// 输出 true
int main() {
struct ListNode* head = NULL; // 建立空链表
SListPushBack(&head, 3); // 为链表插入数据
SListPushBack(&head, 2);
SListPushBack(&head, 0);
SListPushBack(&head, -4);
SListPrint(head);
head->next->next->next = head->next; // 此步骤是建立环形链表
bool re = hasCycle(head);
printf("%d", re); // 打印返回值
return 0;
}
【繁华倾夏】【每日力扣题解分享】【Day7】