Bird
Raised Fist0
DSA Javascriptprogramming~10 mins

Insert at End of Doubly Linked List in DSA Javascript - Execution Trace

Choose your learning style10 modes available
Concept Flow - Insert at End of Doubly Linked List
Create new node
↓
Is list empty?
↓
head = new
↓
Traverse to last node
↓
last.next = new
↓
new.prev = last
↓
Done
We create a new node, check if the list is empty. If yes, new node becomes head. Otherwise, we go to the last node and link the new node after it.
Execution Sample
DSA Javascript
class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
    this.prev = null;
  }
}

function insertAtEnd(head, data) {
  const newNode = new Node(data);
  if (!head) return newNode;
  let current = head;
  while (current.next) current = current.next;
  current.next = newNode;
  newNode.prev = current;
  return head;
}
This code creates a new node and inserts it at the end of a doubly linked list, updating next and prev pointers.
Execution Table
StepOperationNodes in ListPointer ChangesVisual State
1Create new node with data=4010 <-> 20 <-> 30newNode: data=40, next=null, prev=nullā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ data:10│ │ data:20│ │ data:30│ │ next:──┼──→ │ next:──┼──→ │ next:āˆ… │ │ prev:āˆ… │ │ prev:──┼──→ │ prev:──┼──→ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ head
2Check if list is empty10 <-> 20 <-> 30head is not null, continueSame as Step 1
3Traverse to last node10 <-> 20 <-> 30current moves: 10 -> 20 -> 30Same as Step 1, current at node 30
4Link new node after last node10 <-> 20 <-> 30 <-> 4030.next = newNode, newNode.prev = 30ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ data:10│ │ data:20│ │ data:30│ │ data:40│ │ next:──┼──→ │ next:──┼──→ │ next:──┼──→ │ next:āˆ… │ │ prev:āˆ… │ │ prev:──┼──→ │ prev:──┼──→ │ prev:──┼──→ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ head
5Return head10 <-> 20 <-> 30 <-> 40No pointer changesSame as Step 4
šŸ’” Traversal ends when current.next is null (at node 30), new node linked after it.
Variable Tracker
VariableStartAfter Step 1After Step 3After Step 4Final
headNode(10)Node(10)Node(10)Node(10)Node(10)
currentnullnullNode(30)Node(30)Node(30)
newNodenullNode(40)Node(40)Node(40)Node(40)
Key Moments - 3 Insights
Why do we need to update both current.next and newNode.prev?
Because the list is doubly linked, each node points forward and backward. Step 4 shows current.next = newNode and newNode.prev = current to keep links consistent.
What happens if the list is empty (head is null)?
Step 2 checks if head is null. If yes, the new node becomes the head, so the list starts with the new node only.
Why do we stop traversal when current.next is null, not current itself?
Because current.next null means current is the last node. We want to insert after the last node, so we stop at current where current.next is null (Step 3).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table at Step 3, where is the current pointer?
AAt node with data 20
BAt node with data 30
CAt node with data 10
DAt new node with data 40
šŸ’” Hint
Check the 'Pointer Changes' and 'Visual State' columns at Step 3 in execution_table.
At which step does the new node get linked into the list?
AStep 4
BStep 1
CStep 3
DStep 2
šŸ’” Hint
Look for pointer assignments involving newNode in the 'Pointer Changes' column.
If the list was empty, what would be the head after insertion?
Anull
Bnode with data 10
Cnew node with data
Dnode with data 30
šŸ’” Hint
Refer to Step 2 where the empty list case is handled.
Concept Snapshot
Insert at End of Doubly Linked List:
- Create new node with data
- If list empty, head = new node
- Else traverse to last node
- last.next = new node
- new node.prev = last
- Return head
Pointers updated both ways to keep list doubly linked.
Full Transcript
To insert at the end of a doubly linked list, first create a new node with the given data. Check if the list is empty by seeing if head is null. If empty, the new node becomes the head. Otherwise, start at head and move forward until reaching the last node where next is null. Then link the new node after the last node by setting last.next to new node and new node.prev to last. Finally, return the head of the list. This keeps the list connected in both directions.

Practice

(1/5)
1. What is the main purpose of inserting a node at the end of a doubly linked list?
easy
A. To reverse the order of the nodes in the list
B. To remove the first node from the list
C. To add a new element after the last node, updating both next and previous links
D. To find the middle node of the list

Solution

  1. Step 1: Understand the structure of a doubly linked list

    A doubly linked list has nodes with pointers to both the next and previous nodes, allowing traversal in both directions.
  2. Step 2: Purpose of insertion at the end

    Inserting at the end means adding a new node after the current last node and updating the pointers accordingly.
  3. Final Answer:

    To add a new element after the last node, updating both next and previous links -> Option C
  4. Quick Check:

    Insert at end = Add after last node [OK]
Hint: Insert at end means add after last node with correct links [OK]
Common Mistakes:
  • Confusing insertion at end with deletion
  • Not updating previous pointer of new node
  • Trying to insert at beginning instead
2. Which of the following is the correct syntax to create a new node in JavaScript for a doubly linked list?
easy
A. const newNode = new Node(value);
B. const newNode = { value: data, nextNode: null };
C. const newNode = [value, null, null];
D. const newNode = { data: value, next: null, prev: null };

Solution

  1. Step 1: Identify the node structure for doubly linked list

    A node should have data, next pointer, and previous pointer properties.
  2. Step 2: Check each option for correct properties

    const newNode = { data: value, next: null, prev: null }; correctly uses data, next, and prev keys with null pointers initially.
  3. Final Answer:

    const newNode = { data: value, next: null, prev: null }; -> Option D
  4. Quick Check:

    Node = data + next + prev [OK]
Hint: Node needs data, next, and prev keys set [OK]
Common Mistakes:
  • Using wrong property names like value instead of data
  • Missing prev pointer in node
  • Using array instead of object for node
3. Consider the following code snippet that inserts nodes at the end of a doubly linked list. What will be the printed list after inserting 10, 20, and 30?
class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
    this.prev = null;
  }
}

class DoublyLinkedList {
  constructor() {
    this.head = null;
  }

  insertAtEnd(data) {
    const newNode = new Node(data);
    if (!this.head) {
      this.head = newNode;
      return;
    }
    let temp = this.head;
    while (temp.next) {
      temp = temp.next;
    }
    temp.next = newNode;
    newNode.prev = temp;
  }

  printList() {
    let temp = this.head;
    let result = '';
    while (temp) {
      result += temp.data + ' -> ';
      temp = temp.next;
    }
    result += 'null';
    console.log(result);
  }
}

const dll = new DoublyLinkedList();
dll.insertAtEnd(10);
dll.insertAtEnd(20);
dll.insertAtEnd(30);
dll.printList();
medium
A. null
B. 10 -> 20 -> 30 -> null
C. 10 -> 20 -> null
D. 30 -> 20 -> 10 -> null

Solution

  1. Step 1: Insert nodes one by one at the end

    First insert 10 as head, then 20 after 10, then 30 after 20.
  2. Step 2: Print the list from head to end

    Traverse from head: 10 -> 20 -> 30 -> null is printed.
  3. Final Answer:

    10 -> 20 -> 30 -> null -> Option B
  4. Quick Check:

    Insert order = print order [OK]
Hint: Insert at end keeps order; print from head shows insertion order [OK]
Common Mistakes:
  • Confusing insertion order with reversed output
  • Not updating prev pointer causing broken links
  • Printing from tail instead of head
4. The following code tries to insert a node at the end of a doubly linked list but causes an error. What is the mistake?
insertAtEnd(data) {
  const newNode = new Node(data);
  if (!this.head) {
    this.head = newNode;
  }
  let temp = this.head;
  while (temp.next) {
    temp = temp.next;
  }
  temp.next = newNode;
  newNode.prev = temp;
}
medium
A. Missing return after setting head when list is empty
B. Incorrectly assigning newNode.prev instead of newNode.next
C. Not creating newNode with correct constructor
D. Using while loop instead of for loop

Solution

  1. Step 1: Analyze the empty list case

    If head is null, newNode is assigned as head but code continues to traverse and assign next pointers.
  2. Step 2: Identify missing return causing duplicate insertion

    Without return after setting head, code tries to add newNode again after head, causing a cycle or error.
  3. Final Answer:

    Missing return after setting head when list is empty -> Option A
  4. Quick Check:

    Return after empty insert prevents duplicate links [OK]
Hint: Return immediately after empty list insertion [OK]
Common Mistakes:
  • Forgetting to stop function after empty list insert
  • Mixing up prev and next pointers
  • Assuming loop type causes error
5. You want to insert a node with value 40 at the end of a doubly linked list that currently has nodes 10 -> 20 -> 30 -> null. After insertion, what should be the correct state of the list and the pointers of the new node?
hard
A. 10 -> 20 -> 30 -> 40 -> null, newNode.prev points to 30, newNode.next is null
B. 40 -> 10 -> 20 -> 30 -> null, newNode.prev is null, newNode.next points to 10
C. 10 -> 20 -> 30 -> null, newNode.prev and newNode.next both null
D. 10 -> 20 -> 30 -> 40 -> null, newNode.prev is null, newNode.next points to 30

Solution

  1. Step 1: Insert new node at the end

    New node with value 40 is added after node 30, so 30's next points to new node.
  2. Step 2: Set new node's pointers correctly

    New node's prev points to 30, and next is null because it's the last node.
  3. Final Answer:

    10 -> 20 -> 30 -> 40 -> null, newNode.prev points to 30, newNode.next is null -> Option A
  4. Quick Check:

    Last node's next = null, newNode.prev = previous last node [OK]
Hint: New last node prev = old last node, next = null [OK]
Common Mistakes:
  • Setting newNode.prev to null incorrectly
  • Placing new node at the beginning instead
  • Not updating previous last node's next pointer
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard