How to reverse a singly linked list in-place in Pascal

1 Answer

0 votes
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

}


 



answered 5 days ago by avibootz
...