Bird
Raised Fist0
DSA Pythonprogramming~10 mins

Insert at End of Circular Linked List in DSA Python - Execution Trace

Choose your learning style10 modes available
Concept Flow - Insert at End of Circular Linked List
Create new node
↓
Is list empty?
Yes→new_node.next = new_node, head = new_node
No↓
Start at head
↓
Traverse to last node (node.next != head)?
Yes↓
Move to next node
Back to traverse↓
last_node.next = new_node
↓
new_node.next = head
↓
Update tail pointer if used
↓
Done
↩Back to traverse
Insert a new node at the end by linking it after the last node, which points back to head, maintaining circularity.
Execution Sample
DSA Python
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

def insert_at_end(head, data):
    new_node = Node(data)
    if head is None:
        new_node.next = new_node
        return new_node
    current = head
    while current.next != head:
        current = current.next
    current.next = new_node
    new_node.next = head
    return head

# Example (initial list: 10->20->30->10)
# head = insert_at_end(head, 40)  # Results in 10->20->30->40->10
Complete function to insert at the end of a circular singly linked list. Handles empty list. Traverses to last node (where next == head), links new node, sets its next to head.
Execution Table
StepOperationNodes in ListPointer ChangesVisual State
1Create new node with data=4010 -> 20 -> 30 (circular)new_node.next = Noneā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ data:10│ │ data:20│ │ data:30│ │ next:──┼──→ │ next:──┼──→ │ next:──┼──→ head ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ head
2Check if list is empty10 -> 20 -> 30 (circular)No changeSame as step 1
3Start traversal at head (node=10)10 -> 20 -> 30 (circular)current = head (10)Same as step 1
4Check if current.next != head (20 != 10)10 -> 20 -> 30 (circular)No changeSame as step 1
5Move current to next node (20)10 -> 20 -> 30 (circular)current = 20Same as step 1
6Check if current.next != head (30 != 10)10 -> 20 -> 30 (circular)No changeSame as step 1
7Move current to next node (30)10 -> 20 -> 30 (circular)current = 30Same as step 1
8Check if current.next != head (10 == 10)10 -> 20 -> 30 (circular)No changeSame as step 1
9Set current.next = new_node (30.next = 40)10 -> 20 -> 30 -> 40 (circular)30.next → 40ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ data:10│ │ data:20│ │ data:30│ │ data:40│ │ next:──┼──→ │ next:──┼──→ │ next:──┼──→ │ next:āˆ… │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ head
10Set new_node.next = head (40.next = 10)10 -> 20 -> 30 -> 40 (circular)40.next → 10ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ data:10│ │ data:20│ │ data:30│ │ data:40│ │ next:──┼──→ │ next:──┼──→ │ next:──┼──→ │ next:──┼──→ head ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ head
11Insertion complete10 -> 20 -> 30 -> 40 (circular)List circular and updatedFinal circular list with new node at end
šŸ’” Traversal stops when current.next == head, then new node inserted after current.
Variable Tracker
VariableStartAfter Step 3After Step 5After Step 7After Step 9After Step 10Final
headNode(10)Node(10)Node(10)Node(10)Node(10)Node(10)Node(10)
currentNoneNode(10)Node(20)Node(30)Node(30)Node(30)Node(30)
new_nodeNoneNode(40)Node(40)Node(40)Node(40)Node(40)Node(40)
new_node.nextNoneNoneNoneNoneNoneNode(10)Node(10)
current.nextNode(20)Node(20)Node(30)Node(10)Node(40)Node(40)Node(40)
Key Moments - 3 Insights
Why do we check if current.next == head to stop traversal?
Because in a circular linked list, the last node points back to head. When current.next == head, we reached the last node. See execution_table step 8.
What happens if the list is empty when inserting?
If empty, new_node.next points to itself and head is set to new_node, making a single-node circular list. This is shown in concept_flow under 'Is list empty?'.
Why do we set new_node.next = head after insertion?
To maintain circularity, the new last node must point back to head. See execution_table step 10 for this pointer update.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of 'current' after step 5?
ANode with data 20
BNode with data 10
CNode with data 30
DNone
šŸ’” Hint
Check the 'current' variable column in variable_tracker after step 5.
At which step does the new node's next pointer get assigned to head?
AStep 7
BStep 9
CStep 10
DStep 11
šŸ’” Hint
Look at the 'Pointer Changes' column in execution_table for step 10.
If the list was empty, which operation would happen first?
ATraverse to last node
BSet new_node.next = new_node and head = new_node
CSet current.next = new_node
DMove current to next node
šŸ’” Hint
Refer to concept_flow decision for empty list case.
Concept Snapshot
Insert at End of Circular Linked List:
- Create new node
- If list empty: new_node.next = new_node, head = new_node
- Else traverse to last node (node.next == head)
- Set last_node.next = new_node
- Set new_node.next = head
- List remains circular with new node at end
Full Transcript
To insert at the end of a circular linked list, first create a new node. If the list is empty, point the new node's next to itself and set head to this node, forming a single-node circle. If not empty, start at head and traverse nodes until you find the last node, identified when its next points back to head. Then, link the last node's next to the new node, and set the new node's next to head to maintain circularity. This process ensures the list remains circular with the new node at the end.

Practice

(1/5)
1. What happens when you insert a new node at the end of a circular linked list that currently has nodes?
easy
A. The new node is ignored because the list is circular.
B. The new node becomes the head node and points to itself only.
C. The new node is inserted at the beginning and breaks the circular link.
D. The new node becomes the last node and points back to the head node.

Solution

  1. Step 1: Understand the circular linked list structure

    In a circular linked list, the last node points back to the head node, forming a circle.
  2. Step 2: Insert new node at the end

    The new node is linked after the current last node, and its next pointer is set to the head node, maintaining the circle.
  3. Final Answer:

    The new node becomes the last node and points back to the head node. -> Option D
  4. Quick Check:

    Insert at end keeps circle intact = D [OK]
Hint: New end node always points to head to keep circle [OK]
Common Mistakes:
  • Forgetting to link new node back to head
  • Breaking the circular link by pointing to None
  • Inserting at beginning instead of end
2. Which of the following is the correct syntax to create a new node and insert it at the end of a circular linked list in Python?
easy
A. new_node = Node(data); new_node.next = None; last.next = new_node
B. new_node = Node(data); new_node.next = head; last.next = new_node
C. new_node = Node(data); head = new_node; new_node.next = head
D. new_node = Node(data); last.next = None; new_node.next = last

Solution

  1. Step 1: Create new node and link to head

    The new node's next pointer must point to the head to maintain circularity.
  2. Step 2: Link last node to new node

    The current last node's next pointer is updated to point to the new node, completing the insertion.
  3. Final Answer:

    new_node = Node(data); new_node.next = head; last.next = new_node -> Option B
  4. Quick Check:

    New node points to head, last points to new node = A [OK]
Hint: New node next = head; last next = new node [OK]
Common Mistakes:
  • Setting new node next to None breaks circularity
  • Not updating last node's next pointer
  • Assigning head to new node incorrectly
3. What will be the printed output of the circular linked list after inserting 4 at the end, given the initial list is 1 -> 2 -> 3 -> (back to 1)?
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

def insert_end(head, data):
    new_node = Node(data)
    if not head:
        new_node.next = new_node
        return new_node
    temp = head
    while temp.next != head:
        temp = temp.next
    temp.next = new_node
    new_node.next = head
    return head

head = Node(1)
second = Node(2)
third = Node(3)
head.next = second
second.next = third
third.next = head

head = insert_end(head, 4)

# Print circular list
current = head
output = []
while True:
    output.append(current.data)
    current = current.next
    if current == head:
        break
print(output)
medium
A. [1, 2, 3]
B. [4, 1, 2, 3]
C. [1, 2, 3, 4]
D. [1, 2, 3, 4, 1]

Solution

  1. Step 1: Insert 4 at the end of the circular list

    The function finds the last node (3), links it to new node (4), and new node points back to head (1).
  2. Step 2: Print nodes starting from head

    Traverse from head: 1 -> 2 -> 3 -> 4, then back to 1 stops loop. Output list is [1, 2, 3, 4].
  3. Final Answer:

    [1, 2, 3, 4] -> Option C
  4. Quick Check:

    List after insert = [1, 2, 3, 4] [OK]
Hint: Traverse until back to head to print full circular list [OK]
Common Mistakes:
  • Printing extra repeated head node
  • Not updating last node's next pointer
  • Stopping traversal too early
4. Identify the error in this code snippet for inserting at the end of a circular linked list:
def insert_end(head, data):
    new_node = Node(data)
    if not head:
        new_node.next = None
        return new_node
    temp = head
    while temp.next != head:
        temp = temp.next
    temp.next = new_node
    new_node.next = head
    return head
medium
A. new_node.next should point to new_node when list is empty
B. temp.next should be set to None instead of new_node
C. The while loop condition should be temp.next == head
D. The function should return new_node instead of head

Solution

  1. Step 1: Check empty list case

    When list is empty, new_node.next must point to itself to form a circular list, not None.
  2. Step 2: Verify rest of code

    Other parts correctly insert new_node at end and maintain circularity.
  3. Final Answer:

    new_node.next should point to new_node when list is empty -> Option A
  4. Quick Check:

    Empty list node points to itself = B [OK]
Hint: Empty circular list node points to itself, not None [OK]
Common Mistakes:
  • Setting new_node.next to None breaks circularity
  • Wrong while loop condition
  • Returning wrong node after insertion
5. Given a circular linked list with nodes 10 -> 20 -> 30 -> (back to 10), write the output after inserting 5 at the end and then inserting 40 at the end. What is the final list printed?
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

def insert_end(head, data):
    new_node = Node(data)
    if not head:
        new_node.next = new_node
        return new_node
    temp = head
    while temp.next != head:
        temp = temp.next
    temp.next = new_node
    new_node.next = head
    return head

head = Node(10)
second = Node(20)
third = Node(30)
head.next = second
second.next = third
third.next = head

head = insert_end(head, 5)
head = insert_end(head, 40)

current = head
output = []
while True:
    output.append(current.data)
    current = current.next
    if current == head:
        break
print(output)
hard
A. [10, 20, 30, 5, 40]
B. [5, 10, 20, 30, 40]
C. [10, 20, 30, 40, 5]
D. [40, 10, 20, 30, 5]

Solution

  1. Step 1: Insert 5 at the end

    After first insertion, list becomes 10 -> 20 -> 30 -> 5 -> (back to 10).
  2. Step 2: Insert 40 at the end

    After second insertion, list becomes 10 -> 20 -> 30 -> 5 -> 40 -> (back to 10).
  3. Step 3: Print the list

    Traverse from head: 10, 20, 30, 5, 40, then back to 10 stops loop. Output is [10, 20, 30, 5, 40].
  4. Final Answer:

    [10, 20, 30, 5, 40] -> Option A
  5. Quick Check:

    Two inserts at end add nodes in order = A [OK]
Hint: Insertions add nodes at end, order preserved [OK]
Common Mistakes:
  • Inserting new nodes at beginning by mistake
  • Not updating last node's next pointer correctly
  • Printing extra repeated nodes
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