2016-07-26 5 views
-3

이 코드는 C++에서 목록의 중간 노드를 인쇄하는 것으로 밝혀졌지만 코드를 이해하지 못했습니다 ... 누군가이 설명을 할 수 있습니까?단일 링크 목록의 중간 노드

Type& findMiddleNode() 
{ 
    int check = 0; 
    nodeType *current; 
    nodeType *mid; 

    current = first; 
    mid = first; 

    while (current != NULL) 
    { 
     current = current->link; 
     check = (check + 1) % 2; 

     if (check == 0) 
      mid = mid->link; 
    } 

    return mid->info; 
} 

PD :이 코드는 완벽하게 작동하지만 이해가 안됩니다! 누군가 내가 이것을 이해하도록 도와줍니다. 감사!

+0

정확히 이해하지 못하겠습니까? 우리는 당신이 그렇게 말할 때 더 나은 도움을 줄 수 있습니다 :) – Rakete1111

+0

아이디어는 다른 속도의 두 배 빠른 속도로 목록을 가로 지르는 두 개의 포인터를 갖는 것입니다. 빠른 포인터는 모든 반복에서, 느린 포인터는 모든 다른 반복에서만 진행됩니다. 빠른 포인터가 목록의 끝에 도달하면 느린 포인터가 정확히 중간에 위치합니다. –

+0

포인터의 현재 및 중간 기능과 var 전류를 이해하지 못합니다. 나는 while 루프에서 프로세스를 이해하지 못한다. –

답변

2

기본 개념은 목록을 두 개의 포인터의 B와 이동하는 것이지만, B와 A.

check = (check + 1) % 2; 

중 & hellip의 절반 속도로 이동; check에 0, 1, 0, 1 등의 값을 주며, 두 번째 A가 이동 될 때마다 B를 이동시키는 데 사용됩니다.

동일한 생각은 단일 연결 목록에 루프가 포함되어 있는지 확인하는 것과 관련된 질문에 대한 가능한 대답입니다. 이 경우 빠르게 움직이는 포인터는 둘 다 루프에 들어간 후에 느리게 움직이는 포인터를 따라 잡습니다. (1) 노드 N의 수를 계산하고, (2) 다시 시작시 시작에


프로그램에 의해 소비 거의 같은 작업으로, 동일한 작업을 수행하기위한 간단한 방법은,이다 노드 번호 n/2로 이동하십시오.

단계 (1)는 상기와 같은 포인터를 N 배를 이동하고, 단계 (2) 상기 B와 같은 포인터를 N/2 번 이동한다.

관련 문제