#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 ожидает односвязный список. Это самый эффективный способ изменить односвязный список.