Показать сообщение отдельно
  #2  
Старый 25.10.2017, 00:35
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,116
Репутация: 49086
По умолчанию

Ну, как то так:
Код:
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;

Не проверял, но должно работать, если нигде не накосячил.

ЗЫ. я там использовал один трюк. Т.к. у нас односвязный список, а удалять нам надо текущий элемент и нет ссылки на предыдущий (там указатель надо обновить), то вместо удаления текущего я копирую в него данные следуюшего, который надо оставить, и удаляю ставший теперь ненужным слудующий элемент.
Ответить с цитированием