【每日刷题】Day15

【每日刷题】Day15

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

目录

[1. 141. 环形链表 - 力扣(LeetCode)](#1. 141. 环形链表 - 力扣(LeetCode))

[2. 142. 环形链表 II - 力扣(LeetCode)](#2. 142. 环形链表 II - 力扣(LeetCode))

[3. 143. 重排链表 - 力扣(LeetCode)](#3. 143. 重排链表 - 力扣(LeetCode))

1. 141. 环形链表 - 力扣(LeetCode)

//思路:快慢指针。pf1一次走两步,pf2一次走一步,如果是环形,pf1最终一定会追上pf2。如果不是环形,pf1最终会走出链表

typedef struct ListNode LN;

bool hasCycle(struct ListNode *head)

{

if(head==NULL||head->next==NULL)

{

return false;

}

LN* pf1 = head;

LN* pf2 = head;

while(pf1)

{

if(pf1->next==NULL)

{

return false;

}

pf1 = pf1->next->next;

if(pf1==pf2)

{

return true;

}

pf2 = pf2->next;

}

return false;

}

2. 142. 环形链表 II - 力扣(LeetCode)

//思路:快慢指针。pf1一次走两步,pf2一次走一步。当pf1 == pf2时,ptr从第一个节点与pf2同时前进,当相遇时,则是第一个入环的节点。

typedef struct ListNode LN;

struct ListNode *detectCycle(struct ListNode *head)

{

LN* pf1 = head;

LN* pf2 = head;

if(head==NULL||head->next==NULL)

{

return NULL;

}

while(pf1)

{

if(pf1->next==NULL)

{

return NULL;

}

pf1 = pf1->next->next;

pf2 = pf2->next;

if(pf1==pf2)

{

LN* ptr = head;

while(ptr!=pf2)

{

ptr = ptr->next;

pf2 = pf2->next;

}

return ptr;

}

}

return NULL;

}

3. 143. 重排链表 - 力扣(LeetCode)

//思路:本题的难点在于链表无法通过下标来访问其中的内容。但是我们知道数组可以通过下标来访问,那么很容易地可以想到用数据来解这道题。用一个数组1接收链表中每个节点val的值,再用一个数组2按照题目所给顺序从数组1中读取并存储val

typedef struct ListNode LN;

int ListNodeQua(LN* phead)//用于计算链表中节点个数

{

LN* pmove = phead;

int count = 0;

while(pmove)

{

count++;

pmove = pmove->next;

}

return count;

}

void reorderList(struct ListNode* head)

{

LN* pmove = head;

int n = ListNodeQua(head);

int* arr = (int*)malloc(sizeof(int)*n);//数组1

for(int i = 0;i<n;i++)//存储链表中的val

{

arr[i] = pmove->val;

pmove = pmove->next;

}

int* arr1 = (int*)malloc(sizeof(int)*n);//数组2

arr1[0] = arr[0];//第一个节点不变

int x = n-1;//尾下标

int y = 1;

for(int i = 1;i<n;i++)//按照题目所给顺序从数组1中拿取数据

{

if(i%2==1)

{

arr1[i] = arr[x];

x--;

}

else if(i%2==0)

{

arr1[i] = arr[y];

y++;

}

}

pmove = head;

int j = 0;

while(pmove)//最后再将数组2中的数据放入链表中

{

pmove->val = arr1[j++];

pmove = pmove->next;

}

}

相关推荐
readmancynn3 分钟前
二分基本实现
数据结构·算法
萝卜兽编程5 分钟前
优先级队列
c++·算法
Bucai_不才7 分钟前
【数据结构】树——链式存储二叉树的基础
数据结构·二叉树
盼海13 分钟前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步29 分钟前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
Rstln1 小时前
【DP】个人练习-Leetcode-2019. The Score of Students Solving Math Expression
算法·leetcode·职场和发展
芜湖_1 小时前
【山大909算法题】2014-T1
算法·c·单链表
珹洺1 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
几窗花鸢2 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode
.Cnn2 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论