<环形链表>

描述:

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

示例 :

输入:head = [3,2,0,-4], pos = 1

输出:返回索引为 1 的链表节点

解释:链表中有一个环,其尾部连接到第二个节点。

图片分析:
代码分析:

public class Solution {

public ListNode detectCycle(ListNode head) {

//如果链表为空直接返回null

if(head == null)return null;

ListNode slow = head,fast = head,cur = head;

while(fast!=null)

{

slow = slow.next;

if(fast.next!=null)

{

fast = fast.next.next;

}

else

{

return null;

}

if(fast == slow)

{

while(cur!=slow)

{

cur = cur.next;

slow = slow.next;

}

return cur;

}

}

return null;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
画出该程序的流程图#include<iostream> #include<iomanip> #include"kids.h" #include"countingchildren.h" #include"print.h" using namespace std; Kid* pfirst = 0; Kid* pcurrent = 0; Kid* pivot = 0; void main() { int numberofboys, m; cout << "请输入参与约瑟夫的小孩人数"; cin >> numberofboys; cout << endl; cout << "请输出约瑟夫问题的间隔数:"; cin >> m; cout << endl; pfirst = new Kid; pfirst->code = 1; pfirst->pnext = pfirst; pcurrent = pfirst; for (int i = 1; i < numberofboys; i++) { pivot = pcurrent; pcurrent = new Kid; pcurrent->code = i + 1; cout << "请输入第" << i << "个小孩名字"; cin >> pcurrent->name; pivot->pnext = pcurrent; } pcurrent->pnext = pfirst; cout << setw(4) << pfirst->code;//遍历输出 pcurrent = pfirst->pnext; while (pcurrent != pfirst) { cout << setw(4) << pcurrent->code; pcurrent = pcurrent->pnext; } cout << endl; countchildren(pfirst, m); printWinner(pcurrent); } //countchildren.h void countchildren(Kid* pfirst, int m); //countchildren.cpp #include<iostream> #include<iomanip> #include"kids.h" #include"leave.h" #include"print.h" using namespace std; void countchildren(Kid* pfirst, int m) { Kid* pcurrent = 0; Kid* pivot = 0; pcurrent = pfirst; int j; while (pcurrent->pnext != pcurrent) { j = m; do { pivot = pcurrent; pcurrent = pcurrent->pnext; j--; } while (j > 1); printLoser(pcurrent); leave(pivot, pcurrent); } } //print.h #pragma once #include<iostream> #include<iomanip> #include"kids.h" #include"countingchildren.h" using namespace std; void printWinner(Kid* winner); void printLoser(Kid* loser); //print.cpp #include<iostream> #include<iomanip> #include"kids.h" #include"countingchildren.h" using namespace std; #include "print.h" void printWinner(Kid* winner) { cout << "最后胜利的人:" << endl; cout << "其编号:" << setw(4) << winner->code << endl; cout << "名字:" << winner->name << endl; } void printLoser(Kid* loser) { cout << "这轮失败的人:" << endl; cout << "其编号:" << setw(4) << loser->code << endl; cout << "名字:" << loser->name << endl; } //Leave.h #pragma once #include<iostream> #include<iomanip> #include"kids.h" #include"countingchildren.h" using namespace std; void leave(Kid* pivot, Kid* pcurrent ); //leave.cpp #include<iostream> #include<iomanip> #include"kids.h" #include"countingchildren.h" using namespace std; void leave(Kid* pivot, Kid* pcurrent) { pivot->pnext = pcurrent->pnext; delete pcurrent; pcurrent = pivot->pnext; }
06-06

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值