142.环形链表Ⅱ
![](https://i-blog.csdnimg.cn/blog_migrate/13c12e8b1e29fe21ba1f421707ecea30.png)
题目:142. 环形链表 II - 力扣(LeetCode)
①解决思路
方法1:使用快慢指针先使慢指针追到快指针,之后分别使两指针从起始点和相遇点开始向后移动,最终会在入环点相遇(推导如下)
![](https://i-blog.csdnimg.cn/blog_migrate/57dbaafe60b61e2f874a0e77e691a685.png)
②代码实践
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode* fast, *slow, *teg;
fast = slow = head;
//判断链表是否有环
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (fast == slow)//用地址来判断相遇点
{
struct ListNode* meet = fast;
fast = head;
while (fast != meet)
{
meet = meet->next;
fast = fast->next;
}
return meet;
}
}
return NULL;
}
138.复制带随机指针的链表
![](https://i-blog.csdnimg.cn/blog_migrate/d60704fc58b5c880ed2807124e8dc724.png)
题目:138. 复制带随机指针的链表 - 力扣(LeetCode)
①解决思路
方法1:将每一个节点复制使其处于本节点之后,下一个节点之前,复制完成之后,使每个复制节点的random指针指向前一个节点的random指针指向的节点的下一个节点,遍历一遍之后,将这些复制节点分别摘出,形成一个链表并返回。
②代码实践
方法1
struct Node* copyRandomList(struct Node* head)
{
struct Node*cur=head;
//复制链表
while(cur)
{
struct Node*copy=(struct Node*)malloc(sizeof(struct Node));
copy->val=cur->val;
copy->next=cur->next;
cur->next=copy;
cur=copy->next;
}
//复制随机指针
cur=head;
while(cur)
{
struct Node*copy=cur->next;
if(cur->random==NULL)
{
copy->random=NULL;
}
else
{
copy->random=cur->random->next;
}
cur=copy->next;
}
//独立复制出的链表
cur=head;
struct Node* NewHead=NULL,*pre,*next;
while(cur)
{
struct Node*copy=cur->next;
next=copy->next;
if(NewHead==NULL)
{
NewHead=pre=copy;
}
else
{
pre->next=copy;
pre=copy;
}
cur->next=next;
cur=next;
}
return NewHead;
}