
In computer science, a list or sequence is a collection of items that are finite in number and in a particular order. An instance of a list is a computer representation of the mathematical concept of a tuple or finite sequence.
A list may contain the same value more than once, and each occurrence is considered a distinct item.

The term list is also used for several concrete data structures that can be used to implement abstract lists, especially linked lists and arrays. In some contexts, such as in Lisp programming, the term list may refer specifically to a linked list rather than an array. In class-based programming, lists are usually provided as instances of subclasses of a generic "list" class, and traversed via separate iterators.
Many programming languages provide support for list data types, and have special syntax and semantics for lists and list operations. A list can often be constructed by writing the items in sequence, separated by commas, semicolons, and/or spaces, within a pair of delimiters such as parentheses '()', brackets '[]', braces '{}', or angle brackets '<>'. Some languages may allow list types to be indexed or sliced like array types, in which case the data type is more accurately described as an array.
In type theory and functional programming, abstract lists are usually defined inductively by two operations: nil that yields the empty list, and cons, which adds an item at the beginning of a list.
A stream is the potentially infinite analog of a list.: §3.5
Operations
Implementation of the list data structure may provide some of the following operations:
- create
- test for empty
- add item to beginning or end
- access the first or last item
- access an item by index
Implementations
Lists are typically implemented either as linked lists (either singly or doubly linked) or as arrays, usually variable length or dynamic arrays.
The standard way of implementing lists, originating with the programming language Lisp, is to have each element of the list contain both its value and a pointer indicating the location of the next element in the list. This results in either a linked list or a tree, depending on whether the list has nested sublists. Some older Lisp implementations (such as the Lisp implementation of the Symbolics 3600) also supported "compressed lists" (using CDR coding) which had a special internal representation (invisible to the user). Lists can be manipulated using iteration or recursion. The former is often preferred in imperative programming languages, while the latter is the norm in functional languages.
Lists can be implemented as self-balancing binary search trees holding index-value pairs, providing equal-time access to any element (e.g. all residing in the fringe, and internal nodes storing the right-most child's index, used to guide the search), taking the time logarithmic in the list's size, but as long as it doesn't change much will provide the illusion of random access and enable swap, prefix and append operations in logarithmic time as well.
Programming language support
Some languages do not offer a list data structure, but offer the use of associative arrays or some kind of table to emulate lists. For example, Lua provides tables. Although Lua stores lists that have numerical indices as arrays internally, they still appear as dictionaries.
In Lisp, lists are the fundamental data type and can represent both program code and data. In most dialects, the list of the first three prime numbers could be written as (list 2 3 5)
. In several dialects of Lisp, including Scheme, a list is a collection of pairs, consisting of a value and a pointer to the next pair (or null value), making a singly linked list.
Applications
Unlike in an array, a list can expand and shrink.
In computing, lists are easier to implement than sets. A finite set in the mathematical sense can be realized as a list with additional restrictions; that is, duplicate elements are disallowed and order is irrelevant. Sorting the list speeds up determining if a given item is already in the set, but in order to ensure the order, it requires more time to add new entry to the list. In efficient implementations, however, sets are implemented using self-balancing binary search trees or hash tables, rather than a list.
Lists also form the basis for other abstract data types including the queue, the stack, and their variations.
Abstract definition
The abstract list type L with elements of some type E (a monomorphic list) is defined by the following functions:
- nil: () → L
- cons: E × L → L
- first: L → E
- rest: L → L
with the axioms
- first (cons (e, l)) = e
- rest (cons (e, l)) = l
for any element e and any list l. It is implicit that
- cons (e, l) ≠ l
- cons (e, l) ≠ e
- cons (e1, l1) = cons (e2, l2) if e1 = e2 and l1 = l2
Note that first (nil ()) and rest (nil ()) are not defined.
These axioms are equivalent to those of the abstract stack data type.
In type theory, the above definition is more simply regarded as an inductive type defined in terms of constructors: nil and cons. In algebraic terms, this can be represented as the transformation 1 + E × L → L. first and rest are then obtained by pattern matching on the cons constructor and separately handling the nil case.
The list monad
The list type forms a monad with the following functions (using E* rather than L to represent monomorphic lists with elements of type E):
where append is defined as:
Alternatively, the monad may be defined in terms of operations return, fmap and join, with:
Note that fmap, join, append and bind are well-defined, since they're applied to progressively deeper arguments at each recursive call.
The list type is an additive monad, with nil as the monadic zero and append as monadic sum.
Lists form a monoid under the append operation. The identity element of the monoid is the empty list, nil. In fact, this is the free monoid over the set of list elements.
See also
- Array data type – Data type that represents an ordered collection of elements (values or variables)
- Queue – Abstract data type
- Set – Abstract data type for storing unique values
- Stack – Abstract data type
- Stream – Sequence of data items available over time
References
- Reingold, Edward; Nievergelt, Jurg; Narsingh, Deo (1977). Combinatorial Algorithms: Theory and Practice. Englewood Cliffs, New Jersey: Prentice Hall. pp. 38–41. ISBN 0-13-152447-X.
- Abelson, Harold; Sussman, Gerald Jay (1996). Structure and Interpretation of Computer Programs. MIT Press.
- Barnett, Granville; Del tonga, Luca (2008). "Data Structures and Algorithms" (PDF). mta.ca. Retrieved 12 November 2014.
- Lerusalimschy, Roberto (December 2003). Programming in Lua (first edition) (First ed.). Lua.org. ISBN 8590379817. Retrieved 12 November 2014.
- Steele, Guy (1990). Common Lisp (Second ed.). Digital Press. pp. 29–31. ISBN 1-55558-041-6.
In computer science a list or sequence is a collection of items that are finite in number and in a particular order An instance of a list is a computer representation of the mathematical concept of a tuple or finite sequence A list may contain the same value more than once and each occurrence is considered a distinct item A singly linked list structure implementing a list with three integer elements The term list is also used for several concrete data structures that can be used to implement abstract lists especially linked lists and arrays In some contexts such as in Lisp programming the term list may refer specifically to a linked list rather than an array In class based programming lists are usually provided as instances of subclasses of a generic list class and traversed via separate iterators Many programming languages provide support for list data types and have special syntax and semantics for lists and list operations A list can often be constructed by writing the items in sequence separated by commas semicolons and or spaces within a pair of delimiters such as parentheses brackets braces or angle brackets lt gt Some languages may allow list types to be indexed or sliced like array types in which case the data type is more accurately described as an array In type theory and functional programming abstract lists are usually defined inductively by two operations nil that yields the empty list and cons which adds an item at the beginning of a list A stream is the potentially infinite analog of a list 3 5 OperationsImplementation of the list data structure may provide some of the following operations create test for empty add item to beginning or end access the first or last item access an item by indexImplementationsLists are typically implemented either as linked lists either singly or doubly linked or as arrays usually variable length or dynamic arrays The standard way of implementing lists originating with the programming language Lisp is to have each element of the list contain both its value and a pointer indicating the location of the next element in the list This results in either a linked list or a tree depending on whether the list has nested sublists Some older Lisp implementations such as the Lisp implementation of the Symbolics 3600 also supported compressed lists using CDR coding which had a special internal representation invisible to the user Lists can be manipulated using iteration or recursion The former is often preferred in imperative programming languages while the latter is the norm in functional languages Lists can be implemented as self balancing binary search trees holding index value pairs providing equal time access to any element e g all residing in the fringe and internal nodes storing the right most child s index used to guide the search taking the time logarithmic in the list s size but as long as it doesn t change much will provide the illusion of random access and enable swap prefix and append operations in logarithmic time as well Programming language supportSome languages do not offer a list data structure but offer the use of associative arrays or some kind of table to emulate lists For example Lua provides tables Although Lua stores lists that have numerical indices as arrays internally they still appear as dictionaries In Lisp lists are the fundamental data type and can represent both program code and data In most dialects the list of the first three prime numbers could be written as list 2 3 5 In several dialects of Lisp including Scheme a list is a collection of pairs consisting of a value and a pointer to the next pair or null value making a singly linked list ApplicationsUnlike in an array a list can expand and shrink In computing lists are easier to implement than sets A finite set in the mathematical sense can be realized as a list with additional restrictions that is duplicate elements are disallowed and order is irrelevant Sorting the list speeds up determining if a given item is already in the set but in order to ensure the order it requires more time to add new entry to the list In efficient implementations however sets are implemented using self balancing binary search trees or hash tables rather than a list Lists also form the basis for other abstract data types including the queue the stack and their variations Abstract definitionThe abstract list type L with elements of some type E a monomorphic list is defined by the following functions nil L cons E L L first L E rest L L with the axioms first cons e l e rest cons e l l for any element e and any list l It is implicit that cons e l l cons e l e cons e1 l1 cons e2 l2 if e1 e2 and l1 l2 Note that first nil and rest nil are not defined These axioms are equivalent to those of the abstract stack data type In type theory the above definition is more simply regarded as an inductive type defined in terms of constructors nil and cons In algebraic terms this can be represented as the transformation 1 E L L first and rest are then obtained by pattern matching on the cons constructor and separately handling the nil case The list monad The list type forms a monad with the following functions using E rather than L to represent monomorphic lists with elements of type E return A A a consanil displaystyle text return colon A to A a mapsto text cons a text nil bind A A B B l f nilif l nilappend fa bindl f if l consal displaystyle text bind colon A to A to B to B l mapsto f mapsto begin cases text nil amp text if l text nil text append f a text bind l f amp text if l text cons a l end cases where append is defined as append A A A l1 l2 l2if l1 nilconsa appendl1 l2 if l1 consal1 displaystyle text append colon A to A to A l 1 mapsto l 2 mapsto begin cases l 2 amp text if l 1 text nil text cons a text append l 1 l 2 amp text if l 1 text cons a l 1 end cases Alternatively the monad may be defined in terms of operations return fmap and join with fmap A B A B f l nilif l nilcons fa fmapfl if l consal displaystyle text fmap colon A to B to A to B f mapsto l mapsto begin cases text nil amp text if l text nil text cons f a text fmap f l amp text if l text cons a l end cases join A A l nilif l nilappenda joinl if l consal displaystyle text join colon A to A l mapsto begin cases text nil amp text if l text nil text append a text join l amp text if l text cons a l end cases Note that fmap join append and bind are well defined since they re applied to progressively deeper arguments at each recursive call The list type is an additive monad with nil as the monadic zero and append as monadic sum Lists form a monoid under the append operation The identity element of the monoid is the empty list nil In fact this is the free monoid over the set of list elements See alsoLook up list in Wiktionary the free dictionary Array data type Data type that represents an ordered collection of elements values or variables Pages displaying short descriptions of redirect targets Queue Abstract data type Set Abstract data type for storing unique values Stack Abstract data type Stream Sequence of data items available over timeReferencesReingold Edward Nievergelt Jurg Narsingh Deo 1977 Combinatorial Algorithms Theory and Practice Englewood Cliffs New Jersey Prentice Hall pp 38 41 ISBN 0 13 152447 X Abelson Harold Sussman Gerald Jay 1996 Structure and Interpretation of Computer Programs MIT Press Barnett Granville Del tonga Luca 2008 Data Structures and Algorithms PDF mta ca Retrieved 12 November 2014 Lerusalimschy Roberto December 2003 Programming in Lua first edition First ed Lua org ISBN 8590379817 Retrieved 12 November 2014 Steele Guy 1990 Common Lisp Second ed Digital Press pp 29 31 ISBN 1 55558 041 6