type
p = ^a;
a = record
next: ^p
end;
var
p1: p;
生成一个单向链表p1,p1指向链表头,链表尾的next域以nil结尾
//p1指向当前链表的第一个节点,p2用来指向当前链表已经交换到那个位置了
procedure Reverse(p1,p2: p)
var
p3: p;//临时指针变量,用来标记当前链表中某些元素的位置
begin
if p2.next = nil then
//处理到结尾的情况,
begin
//或者是链表中只有一个元素的情况
p2.next := p1;
p1 := p2;
exit;
end;
if p2 = p1 then
//在处理第一个和第二个节点时
begin
p3 := p2.next.next;//用p3指向未倒序部分链表的头节点
p2 := p2.next;
//指向要交换的节点
p2.next := p1;
//将要操做的节点应加到新链表的头上去
p1.next := nil;
//头节点倒序后为尾节点
p1 := p2;
//指重新定向p1指向倒序后链表的头
p2 := p3;
end
else
begin
p3 := p2.next;
//
p2.next := p1;
//将剩余链表的头节点放为倒序后部分的头节点
p1 := p2;
//恢复p1的头指针位置
p2 := p3;
//恢复p2的头指针位置
Reverse(p1,p2);
//递归上述过程,就可将整个链表倒序,以p1为倒序后的头指针
end;
end;