program ReverseLinkedList;
{$mode objfpc}
type
PNode = ^TNode;
TNode = record
Value: Integer; // data stored in the node
Next: PNode; // pointer to the next node
end;
// Create a new node
function CreateNode(AValue: Integer): PNode;
var
N: PNode;
begin
New(N);
N^.Value := AValue;
N^.Next := nil;
Result := N;
end;
// Reverse the linked list in-place
function ReverseList(Head: PNode): PNode;
var
Prev, Current, NextNode: PNode;
begin
Prev := nil;
Current := Head;
// Iterate through the list and reverse links
while Current <> nil do
begin
NextNode := Current^.Next; // save next node
Current^.Next := Prev; // reverse pointer
Prev := Current; // move Prev forward
Current := NextNode; // move Current forward
end;
Result := Prev; // Prev is the new head
end;
// Print the linked list
procedure PrintList(Head: PNode);
var
Temp: PNode;
begin
Temp := Head;
while Temp <> nil do
begin
Write(Temp^.Value);
if Temp^.Next <> nil then
Write(' -> ');
Temp := Temp^.Next;
end;
Writeln;
end;
var
Head: PNode;
begin
// Build a sample list: 1 -> 2 -> 3 -> 4 -> 5
Head := CreateNode(1);
Head^.Next := CreateNode(2);
Head^.Next^.Next := CreateNode(3);
Head^.Next^.Next^.Next := CreateNode(4);
Head^.Next^.Next^.Next^.Next := CreateNode(5);
Writeln('Original list:');
PrintList(Head);
// Reverse the list
Head := ReverseList(Head);
Writeln('Reversed list:');
PrintList(Head);
end.
{
run:
Original list:
1 -> 2 -> 3 -> 4 -> 5
Reversed list:
5 -> 4 -> 3 -> 2 -> 1
}