I'm supposed to implement a double linked list for a uni assignment. Could you explain the idea behind a sentinel node to me?
Sure, I'd be happy to explain the idea behind a sentinel node in a doubly linked list!

A doubly linked list is a data structure that consists of a sequence of nodes, where each node contains a value and two pointers: one that points to the previous node in the sequence (the previous pointer), and one that points to the next node in the sequence (the next pointer). The first node in the sequence is called the head of the list, and the last node is called the tail.

One issue that can arise when working with a doubly linked list is that it can be difficult to handle the case where the list is empty. For example, if you want to insert a new node at the beginning of the list, you need to update the previous pointer of the new node to point to the head of the list (which may not exist if the list is empty). Similarly, if you want to remove a node from the list, you need to update the next pointer of the previous node to point to the next node in the sequence (which may not exist if the node being removed is the head of the list).

To simplify these operations, you can use a sentinel node. A sentinel node is a special node that is added to the beginning and end of the list, and serves as a placeholder for the head and tail of the list. The sentinel node has no value, and its previous pointer points to the tail of the list, while its next pointer points to the head of the list.

With a sentinel node, you can handle the case where the list is empty by simply checking whether the next pointer of the sentinel node points to itself (indicating that there are no other nodes in the list). When you insert a new node at the beginning of the list, you can update the previous pointer of the new node to point to the sentinel node, and the next pointer of the sentinel node to point to the new node. Similarly, when you remove a node from the list, you can update the next pointer of the previous node to point to the next node in the sequence, and update the previous pointer of the next node to point to the previous node in the sequence.

Using a sentinel node can simplify the implementation of a doubly linked list and make it more robust, since you don't need to handle the special case of an empty list separately.
Can you please summarise that in short concise dot points?
Sentinel node: a special placeholder node in a doubly linked list.
Simplifies implementation and reduces edge cases.
Typically used at the beginning and/or end of the list.
Provides a uniform approach for handling insertions and deletions.
Eliminates the need for separate head and tail pointers.
Ensures every node has a next and previous pointer, no need to check for null pointers.
Makes the code for managing the doubly linked list cleaner and more efficient.