求一个单向链表的反转函数Reverse(50分)

  • 主题发起人 主题发起人 gyljp
  • 开始时间 开始时间
G

gyljp

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个单向链表, 如何把它们里面的元素倒过来排列! 最好是有原码
 
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;
 
上述仅仅时示例程序,实际执行时应当将指针调用写成p1^.next
函数调用格式如下:
p2 := p1;
Reverse(p1,p2);
就OK了。
倒序问题只用O(n)的时间复杂度,O(1)的空间复杂度就可以求解。
待会儿再给你一个非递归的求解
 
//p1指向当前链表的第一个节点
procedure Reverse(p1:p)
var
p2,p3: p;//临时指针变量,用来标记当前链表中某些元素的位置
begin
if p1^.next = nil then
exit;
//只有一个节点的情况
p2 := p1^.next;
//对头节点的处理
p1^.next := nil;
while p2^.next <> nildo
//对中间节点的处理
begin
p3 := p2^.next;
p2^.next := p1;
p1 := p2;
p2 :=p3;
end;
p2^.next := p1;
//对尾节点的处理
p1 := p2;
//还原指针p1指向链表的头
end;

调用时,将头节点指针为p1的链表传入函数即可
如:Reverse(p1);
 
接受答案了.
 
后退
顶部