Что значит распутать круговой связанный список? - PullRequest
4 голосов
/ 11 января 2020

Я наткнулся на этот комментарий, просматривая реализацию хуков React. В качестве фона, внутренние перехваты сохраняются в объекте волокна каждого компонента в виде связанного списка, и в соответствии с этим комментарием обновления каждого перехвата сохраняются в виде круглого связанного списка в первый раз.

Для первого обновления очередь представляет собой круговой связанный список, где queue.last.next = queue.first. Как только первое обновление фиксируется, и baseUpdate уже не пусто, мы можем распутать список.

Мои знания в области компьютерных наук не очень сильны, и хотя я немного знаю о связанных списках, Я никогда не сталкивался с термином "разгадать". Глядя на реализацию, правильно ли я считаю, что это просто означает превращение ее обратно в обычный связанный список?

1 Ответ

1 голос
/ 11 января 2020

Полный контекст, на который вы ссылаетесь:

// The last update in the entire queue
const last = queue.last;
// The last update that is part of the base state.
const baseUpdate = hook.baseUpdate;
const baseState = hook.baseState;

// Find the first unprocessed update.
let first;
if (baseUpdate !== null) {
  if (last !== null) {
    // For the first update, the queue is a circular linked list where
    // `queue.last.next = queue.first`. Once the first update commits, and
    // the `baseUpdate` is no longer empty, we can unravel the list.
    last.next = null;
  }
  first = baseUpdate.next;
} else {
  first = last !== null ? last.next : null;
}

Ваше мышление верно; last.next = null; "распутывает" круговой связанный список, устанавливая ссылку last.next на null, которая превращает его в линейную цепочку, а не в oop.

Что касается терминологии, я не Я не думаю, что это особенно распространено и не видит прямых прецедентов с небольшим поиском в сети, поэтому, вероятно, они что-то придумали на месте, чтобы описать то, что код делает случайным образом.

...