チェーンテーブルの中間ノードの値を求めて、チェーンテーブルの環を検出します


チェーンテーブルの中間ノードの値を求めて、チェーンテーブルの環を検出します

int loop(struct Node* head){
	struct Node* p1 = head;
	struct Node* p2 = head;
	int i = 0;
	while(p1 && p2){
		i++;
		if(i!=1){
			if(p1->value == p2->value){
				printf("%d
",i); return 1; } } p1 = p1->next; if(p2->next != null){ p2 = p2->next->next; }else{ return 0; } } printf("%d
",i); return 0; } int middle(struct Node* head){ struct Node* p1 = head; struct Node* p2 = head; while(p2){ p2 = p2->next; if(p2 != null){ p1 = p1->next; p2 = p2->next; } } return p1->value; } int main(int argc,char *argv[]){ /** struct Node* head = create(); print(head); struct Node* x = malloc(sizeof(struct Node)); x->value = 1; delete(x,&head); print(head); **/ struct Node* p1 = malloc(sizeof(struct Node)); p1->value = 1; struct Node* p2 = malloc(sizeof(struct Node)); p2->value = 2; struct Node* p3 = malloc(sizeof(struct Node)); p3->value = 3; struct Node* p4 = malloc(sizeof(struct Node)); p4->value = 4; struct Node* p5 = malloc(sizeof(struct Node)); p5->value = 5; p1->next = p2; p2->next = p3; p3->next = p4; p4->next = p5; p5->next = null; printf(" :%d
",middle(p1)); return 0; }