Эта операция предназначена для соединения двух списков в один результирующий. Она выполняется эффективно в тех случаях, когда есть доступ к последнему элементу списка с трудоемкостью O(1). При соединении двух списков
и
первый элемент списка
становится преемником последнего элемента списка
. При этом возникают вопросы – должен ли получившийся список иметь какое-то новое имя и должны ли сохраниться как таковые исходные списки? Отметим, что удаление списка может проводиться операцией, аналогичной конкатенации. В качестве примера приведем пример присоединения списка S2 к списку S1.
Procedure Concat(S1,S2);
Begin
if S1.last=nil
then S1.last:=S2.last
else if S2.last
nil
then { t:=S1.last^.next;S1.last^.next:=S2.last^.next;
S2.last^.next:=t;S1.last:=S2.last}
end;
В ситуациях, когда системными средствами освобождения памяти пользоваться не удобно можно поступать следующим образом. Завести дополнительный список (например, Free), состоящий из «свободных» узлов списков. При создании (процедура Create) новых узлов вначале забирать узел из этого списка, и только если список пуст, то пользоваться системными средствами. В процедуре удаления (Del) удаляемый узел присоединять к списку Free. Операция удаления списка S сводится к выполнению процедуры Concat(Free,S).