Как изменить односвязный список в Pascal?

#list #pascal #singly-linked-list #freepascal

#Список #паскаль #односвязный список #freepascal

Вопрос:

 program uka3;
type
    itemptr = ^item;
    item = record
        data: integer;
        next: itemptr;
    end;

var
    first, tmp: itemptr;
    n: integer;
begin
    first := nil;
    while not SeekEof do { Reading numbers }
    begin
        read(n);
        new(tmp);
        tmp^.data := n;
        tmp^.next := first;
        first := tmp;
    end;

{ here i need loop that reverse number in right order } 

    tmp := first;
    while tmp <> nil do { Output reversed numbers }
    begin
        writeln(tmp^.data);
        tmp := tmp^.next;
    end;

    while first <> nil do { Free memory }
    begin
        tmp := first^.next;
        dispose(first);
        first := tmp;
    end;
end.
  

Эта программа считывает числа и выводит их в обратном порядке.

Как я могу изменить эти числа в цикле после их прочтения, чтобы они шли в том порядке, в котором они были записаны?

Комментарии:

1. Вы можете сохранить числа по мере их отображения в другой стек, а затем отобразить содержимое этого стека — они снова появятся в обратном порядке, который на самом деле будет в исходном порядке.

Ответ №1:

Ниже приведена процедура, которая изменяет список. Просто вызовите его с помощью ReverseList(сначала).

 procedure ReverseList(var list: itemptr);
    var curr, prev, next: itemptr;
begin
    prev := nil;
    curr := list;
    while curr <> nil do
    begin
        next := curr^.next;
        curr^.next := prev;
        prev := curr;
        curr := next
    end;
    list := prev
end
  

Комментарии:

1. братан, у меня односвязный список) Я поменял его другим стеком

2. @17sean ReverseList ожидает односвязный список. Это самый эффективный способ изменить односвязный список.