To create and initialize a doubly linked list, start by creating a new node with the given data. If the list is empty, set both head and tail pointers to this new node, making it the only node in the list. If the list is not empty, link the new node after the current tail by setting the new node's prev pointer to the tail, the tail's next pointer to the new node, and then update the tail pointer to the new node. This process maintains the doubly linked structure where each node points to both its previous and next nodes. The execution table shows step-by-step how nodes are created and linked, and how pointers are updated. The variable tracker shows how head, tail, and newNode pointers change during the process. Key moments clarify why both head and tail are set when the list is empty, why prev pointer is set on the new node, and the importance of updating tail.next. The visual quiz tests understanding of the list's visual state and pointer updates.