Перевернуть динамический список

В коде по ссылке тоже список переворачивается - это один из способов.

Можно другим способом сделать. Создаём список, потом последовательно извлекаем из начала этого списка элементы и добавляем их в начало другого списка. Таким образом во втором списке элементы окажутся в обратном порядке.

PascalВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

program Project1;
 
type
  {Тип указателя на элемент списка.}
  TPElem = ^TElem;
  {Тип элемента списка.}
  TElem = record
    Data : Integer;
    PNext : TPElem; {Указатель на следующий элемент списка.}
  end;
 
{Удаление однонаправленного списка из памяти.}
procedure Free(var aPList : TPElem);
var
  PDel : TPElem;
begin
  while aPList <> nil do begin
    PDel := aPList;
    aPList := aPList^.PNext;
    Dispose(PDel);
  end;
end;
 
//Распечатка однонаправленного списка.
procedure LWriteln(aPList : TPElem);
var
  i : Integer;
begin
  i := 0;
  while aPList <> nil do begin
    Inc(i);
    if i > 1 then Write(', ');
    Write(aPList^.Data);
    aPList := aPList^.PNext;
  end;
  if i = 0 then
    Writeln('Список пуст.')
  else
    Writeln;
end;
 
var
  PL1, PL2, PEnd, PElem : TPElem;
  i, Num, Code : Integer;
  S : String;
begin
  {Начальная инициализация списков.}
  PL1 := nil;
  PL2 := nil;
 
  repeat
    {Создание списка.}
    Writeln('Создание списка.');
    Writeln('Прекратить ввод - пустая строка + Enter.');
    i := 0;
    PEnd := nil;
    repeat
      Write('Элемент ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Val(S, Num, Code);
        if Code = 0 then begin
          Inc(i);
          {Выделяем память для элемента, записываем значения полей и
          добавляем элемент в конец списка.}
          New(PElem);
          PElem^.Data := Num;
          PElem^.PNext := nil;
          if PL1 <> nil then
            PEnd^.PNext := PElem
          else
            PL1 := PElem;
          PEnd := PElem;
        end else
          Writeln('Неверный ввод. Повторите.');
      end;
    until S = '';
    Writeln('Составлен список:');
    LWriteln(PL1);
 
    {Решение задачи.
    Извлекаем элементы из начала первого списка и добавляем их
    в начало второго списка. Таким образом во втором списке элементы
    расположатся в обратном порядке.}
    PL2 := nil;
    while PL1 <> nil do begin
      {Извлекаем элемент из начала первого списка.}
      PElem := PL1;
      PL1 := PL1^.PNext;
      {Добавляем элемент в начало второго списка.}
      PElem^.PNext := PL2;
      PL2 := PElem;
    end;
 
    Writeln('Перевёрнутый писок:');
    LWriteln(PL2);
 
    {Удаление списков из памяти.}
    Free(PL1);
    Free(PL2);
    Writeln('Списки удалёны из памяти.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.