2016-07-26 7 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 и A по списку, но с B движется только половину скорости А.

Изложение

check = (check + 1) % 2; 

& hellip; дает check значения 0, 1, 0, 1 и т. д., которые используются для перемещения B только каждый второй раз A.

Эта же идея - один из возможных (и ожидаемых) ответов на вопрос о проверке того, содержит ли связанный список один цикл. В этом случае быстро перемещающийся указатель догонит медленный после того, как оба вошли в цикл.


Более простой способ сделать то же самое, только с приблизительно одной и той же работы, затраченной программой, чтобы (1) подсчитать количество узлов п, и (2), начиная с самого начала снова, перейти на номер узла n/2.

Шаг (1) перемещает указатель п раз, как и выше, и стадию (2) перемещает указатель п/2 раза, как B выше.