Допустим, сначала Head указывает на узел [Y], это означает, что [Y] - текущая головка. Мы собираемся вставить новый узел [X], который станет головным узлом нашего списка, поэтому указатель на голову укажет на [X].
Здесь следует помнить, что в начале времени (прежде чем вставлять что-либо в список) голова укажет на NiL.
Теперь давайте шаг идти за шагом с псевдокоде, чтобы увидеть, что происходит:
Текущая ситуация нашего списка: Head -> [Y], [Y].prev -> NiL
, а голова указывает на [Y], так что пока мы не изменим указатель Head , всякий раз, когда мы используем Head, вы можете думать/читать его как [Y]. Теперь нынешний глава узел [Y] будет идти после того, как [X], так позволяет установить следующий из [X] = [Y]
1. x.next = L.head
После утверждения кулак, мы имеем [X].next->[Y], Head->[Y], [Y].prev->NiL
2. if (L.head != NIL) //At the beginning Head might be pointing to NiL, and of course NiL.prev does not exist and we do not want to access illegal location.
3. L.head.prev = x //if head is not pointing to Nil then it is pointing to [Y],
//in that case [X] will be the prev node of [Y],
//so after this line, have Head->[Y], [X].next->[Y], [Y].prev->[X]
После 3 line, мы можем смело установить наш список Указатель на точку [X]
4. L.head = x
5. x.prev = NIL //You can write L.head.prev = NIL, as [X] is now the new head
Вы изменили псевдокод от CLRS, было ли оно намеренным? Первая строка должна быть 'x.next = L.head' not' x.prev = L.head' – sowrov
да большое спасибо – 2013-03-27 10:46:50