RosettaCodeData/Task/Doubly-linked-list-Definition/PascalABC.NET/doubly-linked-list-definiti...

76 lines
1.4 KiB
ObjectPascal

type Node<T> = auto class
data: T;
prev,next: Node<T>;
end;
type
MyLinkedList<T> = class
first, last: Node<T>;
procedure AddFirst(x: T);
begin
if first = nil then
begin
first := new Node<T>(x,nil,nil);
last := first
end
else
begin
var p := new Node<T>(x,nil,first);
first.prev := p;
first := p;
end;
end;
procedure AddLast(x: T);
begin
if first = nil then
begin
first := new Node<T>(x,nil,nil);
last := first
end
else
begin
var p := new Node<T>(x,last,nil);
last.next := p;
last := p;
end;
end;
procedure AddAfter(p: Node<T>; x: T);
begin
if last = p then
AddLast(x)
else begin
var pp := new Node<T>(x,p,p.next);
p.next := pp;
pp.next.prev := pp;
end
end;
procedure PrintList();
begin
var p := first;
while p<>nil do
begin
Print(p.data);
p := p.next;
end;
end;
procedure PrintBack();
begin
var p := last;
while p<>nil do
begin
Print(p.data);
p := p.prev;
end;
end;
end;
begin
var lst := new MyLinkedList<integer>;
lst.AddFirst(2); lst.AddFirst(3);
lst.AddLast(5);
lst.AddAfter(lst.first,555);
lst.PrintList;
Println;
lst.PrintBack;
end.