Ну, как то так:
Код:
type
PLinkedList = ^TLinkedList;
TLinkedList = record
Data : Integer;
Next : PLinkedList;
end;
function DeleteItemsLessThanNext(AList : PLinkedList) : PLinkedList;
var
tmp : PLinedList;
begin
Result := AList;
If Result = Nil Then Exit; // List is empty
While AList.Next <> Nil Do
Begin
If AList.Data < AList.Next.Data // if current is less than next - delete current
Then
Begin
// As soon as we delete current item - we do not need to switch to next item
If Result = AList
Then
Begin
// Delete 1st item, just repoint pointer to the head
tmp := AList;
AList := AList.Next;
Result := AList;
Dispose(tmp);
End
Else
Begin
// Delete current item that is not head of the list. Use the trick:
// instead of deleting current element - copy next then delete next
tmp := AList.Next;
AList.Data := AList.Next.Data;
AList.Next := AList.Next.Next;
Dispose(tmp);
End;
End
Else
AList := AList.Next; // current item is greater or equal to the next - just switch to next item
End;
end;
Не проверял, но должно работать, если нигде не накосячил.
ЗЫ. я там использовал один трюк. Т.к. у нас односвязный список, а удалять нам надо текущий элемент и нет ссылки на предыдущий (там указатель надо обновить), то вместо удаления текущего я копирую в него данные следуюшего, который надо оставить, и удаляю ставший теперь ненужным слудующий элемент.