141. 环形链表 - 力扣(LeetCode)
https://leetcode.cn/problems/linked-list-cycle/
首先一个链表要是是环状,那么他一直走也不会走到自己是空的情况
如果一个链表不是环状,那他走到最后一定会走到自己是空的情况
接下来用快慢指针的思维开始运行,让快指针每次都比慢指针多走一步,又换的情况下最终快指针都会赶上套住慢指针
cpp
bool hasCycle(struct ListNode *head) {
struct ListNode* slow=head;
struct ListNode *fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
{
return true;
}
}
return false;
}
142. 环形链表 II - 力扣(LeetCode)
https://leetcode.cn/problems/linked-list-cycle-ii/description/

这道题就是结合了判断有环和两个链表找是否用重合的办法
cpp
struct ListNode *detectCycle(struct ListNode *head) {
if (head == NULL)
return NULL;
struct ListNode* slow=head;
struct ListNode *fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
{
struct ListNode *curA=head;
struct ListNode *curB=fast->next;
struct ListNode *curC=fast->next;
fast->next = NULL;
int lenA=0,lenB=0;
while(curA)
{
curA=curA->next;
lenA++;
}
while(curB)
{
curB=curB->next;
lenB++;
}
curA=head;
curB=curC;
int gap=0;
if(lenA>=lenB)
{
gap=lenA-lenB;
while(gap--)
{
curA=curA->next;
}
while(curA!=curB)
{
curA=curA->next;
curB=curB->next;
}
return curA;
}
else
{
gap=lenB-lenA;
while(gap--)
{
curB=curB->next;
}
while(curA!=curB)
{
curA=curA->next;
curB=curB->next;
}
return curA;
}
}
}
return NULL;
}
LCR 026. 重排链表 - 力扣(LeetCode)
https://leetcode.cn/problems/LGjMqU/
这道题融合了之前逆置和找中间节点的思路
先要完成找中间节点,然后将后半部分链表进行逆置,再将其一个一个插入即可.
在做题时我们要注意边界情况就是链表内节点个数时偶数和奇数会不会对这段解题思路有影响,在这道题中是没有影响的

cpp
void reorderList(struct ListNode* head){
//利用快慢指针找到中间节点
struct ListNode* slow=head;
struct ListNode *fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
//slow为中间节点
struct ListNode *cur=slow->next;
slow->next=NULL;
//将后半段链表逆置
struct ListNode *newmid=NULL;
while(cur)
{
//采用头插来实现逆置
struct ListNode *next=cur->next;
cur->next=newmid;
newmid=cur;
cur=next;
}
struct ListNode* insertnode=head;
cur=newmid;
//再将其隔一个进行插入
while(cur)
{
struct ListNode *next=cur->next;
struct ListNode *insertnext=insertnode->next;
cur->next=insertnode->next;
insertnode->next=cur;
cur=next;
insertnode=insertnext;
}
}