环路检测

/*
给定一个有环链表,实现一个算法返回环路的开头节点。
有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。


示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

进阶:
你是否可以不用额外空间解决此题?

来源:力扣(LeetCode)
*/
/*
说明:
1、快慢指针,快指针+2,慢指针+1,如果链表有环,一定会相遇;
2、第一次相遇后,慢指针再从head处+1,快指针从第一次相遇处+1,第二次相遇即为入口点;

|    x             |   y |  
--------------------------
      第二次相遇到 \     |
                    \    | 
				   w \	 | z
				  	  \	 |
				  	   \ | 
				  		\|-
						 第一次相遇
第一次相遇:
快:x+y+z+w+y+z
慢:x+y+z
==>	x+y+z+w+y+z = 2(x+y+z)				 
==> x + w = x + y
==> w = y
==> 第二次就在入口相遇						  
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct ListNode {
	int val;
	struct ListNode *next;
};

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *quickNode = head, *slowNode = head;
	
	do {
		if (!quickNode || !slowNode || !quickNode->next || !quickNode->next->next) {
			return NULL;
		}
		quickNode = quickNode->next->next;
		slowNode = slowNode->next;
	} while(quickNode != slowNode);
	
	slowNode = head;
    while (slowNode != quickNode) {
		slowNode = slowNode->next;
		quickNode = quickNode->next;
	}

	return quickNode;
}

struct ListNode* createList(int* values, int len){
	int i = 0;
	struct ListNode *head = NULL, *tail = NULL, *node = NULL;
	
	if(!values || len==0) {
		return NULL;
	}
	
	for (i = 0; i < len; i++) {
		 node = (struct ListNode*)malloc(sizeof(struct ListNode));
		 if(!node) {
			exit(1);
		 }
		 node->val = values[i];
		 node->next = NULL;
		 if(!head){
			head = node;
			tail = head;
		 }else{
			tail->next = node;
			tail = node;
		 }
	}
	
	tail->next = head->next;

	return head;
}

void printList(struct ListNode* head,char* msg){
	struct ListNode* node = head;
	int i = 0;
	
	if (msg){
		printf("%s:",msg);
	} else {
		printf("list:");
	}
	
	while (node) {
		printf("%d  ",node->val);
		node = node->next;
	}
	printf("\r\n");
}

int main(){
	struct ListNode* head = NULL;
	int values[]={3,2,0,-4};

	head = createList(values,sizeof(values)/sizeof(values[0]));
	
	printf("val:%d\r\n",detectCycle(head)->val);
	
	//printList(head,"test list");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 华为S9303开启环路检测是为了确保网络的稳定性和安全性。在网络中,环路是指数据在网络中形成的循环路径,会导致数据包重复发送和数据拥塞,从而影响网络的正常运行。 开启环路检测功能后,华为S9303可以主动识别和检测网络中的环路,并采取相应的措施进行处理。当网络中出现环路时,华为S9303会自动进行环路检测,识别并通知管理员有关环路的信息。 华为S9303开启环路检测功能的具体步骤如下: 1. 登录到华为S9303的管理界面,确保具备管理员权限。 2. 在命令行界面中输入命令:system-view,进入系统视图模式。 3. 输入命令:loop-detect enable,开启环路检测功能。 4. 输入命令:loop-detect notice interval <时间间隔>,设置环路检测通知的时间间隔。时间间隔应根据网络的实际情况进行设置。 5. 输入命令:quit,退出系统视图模式。 开启环路检测功能后,华为S9303会定期检测网络中的环路,并及时通知管理员。管理员可以根据收到的通知信息,迅速排除环路问题,从而保证网络的正常运行。 总之,华为S9303开启环路检测功能,可以提升网络的可靠性和安全性,保障网络正常运行,并减少环路带来的不良影响。 ### 回答2: 华为S9303交换机开启环路检测功能的操作步骤如下: 1. 登录到S9303交换机的管理界面,输入正确的用户名和密码,进入设备管理界面。 2. 进入命令视图,在命令行界面输入"system-view"命令,进入系统视图。 3. 在系统视图中,输入"stp mode rstp"命令,将交换机的生成树协议模式设置为RSTP(快速生成树协议)模式。 4. 接下来,进入相应的接口视图,选择需要开启环路检测功能的接口。例如,进入Ethernet 1/0/1的接口视图,输入"interface Ethernet 1/0/1"命令。 5. 在接口视图中,输入"stp bpdu-filter"命令,开启BPDU过滤功能,该功能可过滤和丢弃接收到的BPDU帧,以避免环路的形成。 6. 最后,输入"quit"命令返回系统视图,再输入"save"命令进行配置保存,并输入"quit"命令退出交换机管理界面。 以上是华为S9303交换机开启环路检测功能的简要步骤说明。请注意,在实际操作中,还需根据网络拓扑和需求进行更详细的配置和调整。 ### 回答3: 华为S9303交换机开启环路检测的方法有两种:一种是通过命令行界面配置,另一种是通过Web界面配置。 通过命令行界面配置,首先需要登录到交换机的控制台,然后进入系统视图。在系统视图下,使用以下命令开启环路检测: [Switch] loopdetect enable 通过Web界面配置,首先打开Web浏览器,输入交换机的IP地址,进入Web界面。在Web界面上,找到“系统”选项,在“环路检测”下,点击“启用”按钮,即可开启环路检测。 开启环路检测后,交换机会在网络中检测并防止环路的发生。当交换机接收到一个帧时,会将该帧的源MAC地址添加到一个环路检测表中。如果交换机再次收到带有相同源MAC地址的帧,说明发生了环路。此时,交换机会通过发送环路检测报文来检测并解决这个环路,从而避免网络出现故障。 需要注意的是,开启环路检测会增加交换机的处理负担,可能会导致网络性能下降。因此,在正常情况下,建议不开启环路检测。只有在网络出现问题且怀疑是由环路造成时,才开启环路检测来定位和解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值