import { LinkedListElement, LinkedListElementStruct } from "./linked-list-element";
/**
 * Extended window interface containing DSinJS module.
 */
export declare class ExtendedWindow extends Window {
    DSinJS: {
        LinkedListElement: typeof LinkedListElement;
        LinkedList: typeof LinkedList;
    };
    LinkedListElement: typeof LinkedListElement;
    LinkedList: typeof LinkedList;
}
/**
 * Main Linked List class, contains start node and basically the whole list.
 * @class LinkedList
 * @public
 * @example
 * var lList = new LinkedList(10);
 * lList.insert(20);
 * lList.insert(30);
 * lList.delete(30);
 * lList.toArray(); // => [10,20]
 */
export declare class LinkedList<T> {
    /**
     * @property _start
     * Is the starting element of the list.
     * @type {LinkedListElement<T>}
     * @private
     * @member
     * @property
     */
    private _start;
    /**
     * @property _length
     * Private member of linked list containing length of the list.
     * @type {number}
     * @private
     * @member
     * @property
     */
    private _length;
    /**
     * @property length
     * Readonly, Public member of linked list containing length of the list.
     * @type {number}
     * @public
     * @member
     * @property
     * @readonly
     * @example
     * var lList = new LinkedList(15);
     * lList.length; // => 1
     */
    get length(): number;
    /**
     * Standard constructor, accepts data values as LinkedListElement or T (actual data).
     * @param {LinkedListElement<T> | T} startElem Starting element of your linked list.
     */
    constructor(startElem: LinkedListElement<T> | T);
    /**
     * Inserts the given element at the end of the Linked List.
     * @param {T[]} item New elements array to be inserted.
     * @public
     * @method insert
     * @member
     * @returns {LinkedListElement<T>} newly added element instance.
     * @example
     * var lList = new LinkedList(30);
     * lList.insert([15, 45]);
     * lList.toArray(); // => [30, 15, 45]
     */
    insert(item: T[]): LinkedListElement<T>;
    /**
     * Inserts the given element at the end of the Linked List.
     * @param {T} item New element to be inserted.
     * @public
     * @method insert
     * @member
     * @returns {LinkedListElement<T>} newly first added element instance.
     * @example
     * var lList = new LinkedList(30);
     * lList.insert(15);
     * lList.insert(60);
     * lList.toArray(); // => [30, 15, 60]
     */
    insert(item: T): LinkedListElement<T>;
    /**
     * Inserts the given element at the end of the Linked List.
     * @param {LinkedListElement<T>} item New element to be inserted.
     * @public
     * @method insert
     * @member
     * @returns {LinkedListElement<T>} newly added element instance.
     * @example
     * var lList = new LinkedList(30);
     * var elem = new LinkedListElement(40);
     * lList.insert(elem);
     * lList.toArray(); // => [30, 40]
     */
    insert(item: LinkedListElement<T>): LinkedListElement<T>;
    /**
     * Inserts the given element array at the end of the Linked List.
     * @param {LinkedListElement<T>[]} item New element to be inserted.
     * @public
     * @method insert
     * @member
     * @returns {LinkedListElement<T>} newly first added element instance.
     * @example
     * var lList = new LinkedList(30);
     * var elem = new LinkedListElement(40);
     * lList.insert(elem);
     * lList.toArray(); // => [30, 40]
     */
    insert(item: LinkedListElement<T>[]): LinkedListElement<T>;
    private _InsertRawTypeItem;
    private _InsertRawTypeItemArray;
    private _insertLLElem;
    private _insertLLElemArray;
    /**
     * Inserts the given element at the end of the Linked List.
     * @param {T[]} item New elements array to be inserted.
     * @public
     * @method push
     * @member
     * @returns {LinkedListElement<T>} newly added element instance.
     * @example
     * var lList = new LinkedList(30);
     * lList.push([15, 45]);
     * lList.toArray(); // => [30, 15, 45]
     */
    push(item: T[]): LinkedListElement<T>;
    /**
     * Inserts the given element at the end of the Linked List.
     * @param {T} item New element to be inserted.
     * @public
     * @method push
     * @member
     * @returns {LinkedListElement<T>} newly first added element instance.
     * @example
     * var lList = new LinkedList(30);
     * lList.push(15);
     * lList.push(60);
     * lList.toArray(); // => [30, 15, 60]
     */
    push(item: T): LinkedListElement<T>;
    /**
     * Inserts the given element at the end of the Linked List.
     * @param {LinkedListElement<T>} item New element to be inserted.
     * @public
     * @method push
     * @member
     * @returns {LinkedListElement<T>} newly added element instance.
     * @example
     * var lList = new LinkedList(30);
     * var elem = new LinkedListElement(40);
     * lList.push(elem);
     * lList.toArray(); // => [30, 40]
     */
    push(item: LinkedListElement<T>): LinkedListElement<T>;
    /**
     * Inserts the given element array at the end of the Linked List.
     * @param {LinkedListElement<T>[]} item New element to be inserted.
     * @public
     * @method push
     * @member
     * @returns {LinkedListElement<T>} newly first added element instance.
     * @example
     * var lList = new LinkedList(30);
     * var elem = new LinkedListElement(40);
     * lList.push(elem);
     * lList.toArray(); // => [30, 40]
     */
    push(item: LinkedListElement<T>[]): LinkedListElement<T>;
    /**
     * Deletes the given element if present and returns element instance otherwise returns null.
     * @param {T} item New element to be pushed.
     * @public
     * @method delete
     * @member
     * @returns {LinkedListElement<T> | null} Returns deleted elemnt or null.
     * @example
     * var elem = new LinkedList(30);
     * elem.insert(15);
     * elem.insert(60);
     * elem.delete(15); // => { data: 15, next: null }
     * elem.delete(50); // null
     */
    delete(item: T): LinkedListElement<T> | null;
    /**
     * Removes last element in the linked list and returns it.
     * @public
     * @method pop
     * @member
     * @returns {LinkedListElement<T> | null} Returns deleted elemnt or null.
     * @example
     * var elem = new LinkedList(30);
     * elem.insert(15);
     * elem.insert(60);
     * elem.pop(15); // => { data: 15, next: null }
     * elem.pop(60); // null
     */
    pop(): LinkedListElement<T> | null;
    /**
     * Checks for given item in the entire list and returns true if available.
     * @param {T} item New element to be checked.
     * @public
     * @method has
     * @member
     * @returns {boolean} newly added element instance.
     * @example
     * var elem = new LinkedList(30);
     * elem.insert(15);
     * elem.insert(60);
     * elem.has(15); // true
     * elem.has(50); // false
     */
    has(item: T): boolean;
    /**
     * Traverses the whole list and calls given callback function for each element.
     * @param {{(elem :LinkedListElement<T>, index: number) => boolean}} callback Callback function to be called
     * for each element instance. If function returns false for any value then it stops traversal.
     * @public
     * @method traverse
     * @member
     * @returns {void} Returns undefined.
     * @example
     * var dataPrinter = (el) => { console.log(el.data); };
     * var lList = new LinkedList(15);
     * lList.insert(30);
     * lList.traverse(dataPrinter); // => 15...20
     */
    traverse(callback: (elem: LinkedListElement<T>, index: number) => boolean): void;
    /**
     * Returns an iterable of key, value pairs for element in the Linked List.
     * @public
     * @method entries
     * @member
     * @returns {IterableIterator<[number, T]>} Iterables of index keys and values.
     * @example
     * var lList = LinkedList.fromArray([1, 2, 3]);
     * for (const [index, item] of lList.entries()) {
     *   console.log(index, item); // => 0 1...1 2...2 3
     * }
     */
    entries(): IterableIterator<[number, T]>;
    /**
     * Standard Iterator.
     * @public
     * @method [Symbol.iterator]
     * @member
     * @returns {IterableIterator<T>} Iterables of element values.
     * @example
     * var lList = LinkedList.fromArray([1, 2, 3]);
     * for (const item of lList.entries()) {
     *   console.log(item); // => 1...2...3
     * }
     */
    [Symbol.iterator](): IterableIterator<T>;
    /**
     * Traverses the whole list and calls given callback function for each element.
     * @param {{(elem :LinkedListElement<T>, index: number) => boolean}} callback Callback function to be called
     * for each element instance. If function returns false for any value then it stops traversal.
     * @public
     * @method each
     * @member
     * @returns {void} Returns undefined.
     * @example
     * var dataPrinter = (el) => { console.log(el.data); };
     * var lList = new LinkedList(15);
     * lList.insert(30);
     * lList.each(dataPrinter); // => 15...20
     */
    each(callback: (elem: LinkedListElement<T>, index: number) => boolean): void;
    /**
     * Traverses the whole list and calls given callback function for each element.
     * @param {{(elem :LinkedListElement<T>, index: number) => boolean}} callback Callback function to be called
     * for each element instance. If function returns false for any value then it stops traversal.
     * @public
     * @method forEach
     * @member
     * @returns {void} Returns undefined.
     * @example
     * var dataPrinter = (el) => { console.log(el.data); };
     * var lList = new LinkedList(15);
     * lList.insert(30);
     * lList.forEach(dataPrinter); // => 15...20
     */
    forEach(callback: (elem: LinkedListElement<T>, index: number) => boolean): void;
    /**
     * Maps current linked list values to a new linked list with modifying the values using given callback function.
     * Uses BFS.
     * @param {{(value: T) => T}} callback callback function for value modifier.
     * @method map
     * @member
     * @public
     * @returns {LinkedList<T>} A newly mapped linked list.
     * @example
     * var lList = LinkedList.fromArray([10, 20, 30, 40]);
     * var lList2 = lList.map(n => n * 2);
     * var arr2 = lList2.toArray(); // [20, 40, 60, 80]
     */
    map(mappingFnc: (item: T) => T): LinkedList<T>;
    /**
     * Filters each item based on given filter function and returns new linked list.
     * If no value is filtered then returns null.
     * @param {{(value: T) => boolean}} filterFnc callback function for filtering purpose.
     * @method filter
     * @member
     * @public
     * @returns {LinkedList<T> | null} New filtered instance of tree or null.
     * @example
     * var lList = LinkedList.fromArray([10, 20, 30, 40]);
     * var lList2 = lList.filter(n => !!(n % 4 === 0));
     * var arr2 = lList2.toArray(); // [20, 40]
     */
    filter(filterFnc: (value: T) => boolean): LinkedList<T> | null;
    /**
     * Reduces each element value using reduceFunction and returns final value.
     * @param {(next: T2, value: T, index: number, tree: BTree<T>) => T2} reduceFnc callback function
     * for reducing each node value to a final value.
     * @param {T2} initialValue Optional, Accumulator/Initial value.
     * @method reduce<T2>
     * @member
     * @public
     * @returns {T2} Returns reduced value
     * @example
     * var lList = LinkedList.fromArray([10, 20, 30, 40]);
     * var sum = lList.reduce((acc, elem) => acc + elem); // => 100
     */
    reduce<T2 = any>(reduceFnc: (next: T2, value: T, index: number, lList: LinkedList<T>) => T2, initialValue?: T2): T2;
    /**
     * Returns element at given location.
     * @param {number} index Index to find the element.
     * @public
     * @method get
     * @member
     * @returns {{T | null}} Returns element found at given element, if its not reachable returns null.
     * @example
     * var lList = new LinkedList(15);
     * lList.insert(30);
     * lList.insert(45);
     * lList.get(2); // => 45
     */
    get(index: number): T | null;
    /**
     * Returns string form of the linked list.
     * @public
     * @method toString
     * @member
     * @returns {string} Returns string form of the linked list.
     * @example
     * var lList = new LinkedList(1);
     * lList.push(2);
     * lList.toString(); // => "12"
     */
    toString(): string;
    /**
     * Returns javascript root object form of the linked list.
     * @public
     * @method toJSON
     * @member
     * @returns {LinkedListElementStruct<T>} Returns javascript root object form of the linked list.
     * @example
     * var lList = new LinkedList(1);
     * lList.push(2);
     * lList.toJSON(); // => { data: 1, next: { data: 2, next: null } }
     */
    toJSON(): LinkedListElementStruct<T>;
    /**
     * Returns array form of the linked list.
     * @public
     * @method toArray
     * @member
     * @returns {T[]} Returns array form of the linked list.
     * @example
     * var lList = new LinkedList(1);
     * lList.push(2);
     * lList.push(3);
     * lList.toArray(); // => [1, 2, 3]
     */
    toArray(): T[];
    /**
     * A static method, Creates a Linked List instance from given array.
     * @param {T[]} array Array of elements.
     * @public
     * @method fromArray
     * @static
     * @returns {LinkedList<T>} Returns new linked list instance with all elements in array.
     * @example
     * var lList = LinkedList.fromArray([1, 2, 3]);
     * lList.length; // => 3
     */
    static fromArray<T>(array: T[]): LinkedList<T>;
}
