%
%  List 4.2 : doppelt verkettete Liste
%    Verwaltungsfunktionen
%
classdef DList < handle 

  properties
    front = DNode.empty;   % Kopf der Liste
    back  = DNode.empty;   % Ende der Liste
  end   % properties
  
  methods 
    % Konstruktor mit leerer Liste 
    function obj = DList()
      obj.front = DNode.empty;
      obj.back  = DNode.empty;      
    end
        
    % Knoten node hinten anhängen  
    function pushBack( obj, node )
      pre = obj.back;    % bisheriges Ende
      obj.back = node;   % neues Ende 
      % Check, ob Liste leer ist  
      if( isempty( obj.front ) )
        obj.front = node;   % neuer Kopf der Liste 
      else 
        pre.next  = node;    % als Nachfolger von pre
        node.prev = pre;
      end
    end
    
    % Knoten node vorne anhängen  
    function pushFront( obj, node )
      succ = obj.front;     % bisheriger Start 
      obj.front = node;     % neuer Start 
      if( isempty( obj.back ) )  % 1. Knoten in Liste
        obj.back  = node;
      else
        node.next = succ;
        succ.prev = node;
      end
    end 
 
  end   % methods
    
end
