在Pascal中如何反向单链表?

问题描述

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.

该程序读取数字并以相反的顺序输出它们。

在读取它们后如何在循环中反转这些数字,以便它们按写入的顺序排列?

解决方法

下面是一个反转列表的过程。只需使用 ReverseList first )调用它即可。

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