В приведенном ниже коде мы вставляем узел в заданную позицию.
Мой вопрос: зачем нам нужно использовать pos-2
в условии for
?
insertNode(Node *head,int pos,int data)
{
Node *temp=new Node(data);
if (pos==1)
{
temp->next=head;
return temp;
}
Node * curr=head;
for(int i=1;i<=pos-2 && curr!=NULL ;i++)
curr=curr->next;
if (curr==NULL)
return head;
temp->next=curr->next;
curr->next=temp;
return head;
}
Некоторые вещи, которые следует отметить:
Мы хотим, чтобы curr
указывал на узел, который предшествует — это позиция, в которую должен быть вставлен новый узел. Это потому, что мы произведем вставку с помощью curr->next=temp
, где temp
— новый узел.
Поскольку у головного узла нет предшественника, это особый случай. Это происходит, когда pos
равно 1.
Когда pos
равно 2, предыдущий узел является головным узлом. Поскольку curr
инициализируется как head
, он не должен двигаться. Так что и в этом случае мы не хотим, чтобы цикл выполнял какие-либо итерации.
Когда pos
равно 3, предшествующим узлом является узел второй в списке. Поскольку curr
указывает на head
, ему нужно сделать один шаг вперед, т. е. цикл должен повториться только один раз. Это происходит, когда вы делаете условие for
как <=pos-2
.
В качестве альтернативы вы можете предположить, что мы уже рассмотрели случай, когда pos
равно 1, поэтому мы можем позволить циклу начинаться с pos=2
, а затем мы также можем заменить <=
на <
, что означает, что мы хотим добраться до позиции предшествующий, не в позиция. И теперь заголовок цикла выглядит так:
for (int i = 2; i < pos && curr != NULL; i++)
Это выполняет такое же количество итераций, но, возможно, это более читабельно.
Я надеюсь, что это объясняет это.
Большое спасибо. :)