Given the head of a doubly linked list and an integer X, insert a node with value X before the head of the linked list and return the head of the modified list.
Input: head -> 1 <-> 2 <-> 3, X = 3
Output: head -> 3 <-> 1 <-> 2 <-> 3
Explanation: 3 was added before the 1st node. Note that the head's value is changed.
Input: head -> 5, X = 7
Output: head -> 7 <-> 5
Input: head -> 2 <-> 3, X = 10
#include <bits/stdc++.h>
using namespace std;
// Definition of doubly linked list
struct ListNode
{
int val;
ListNode *next;
ListNode *prev;
ListNode()
{
val = 0;
next = NULL;
prev = NULL;
}
ListNode(int data1)
{
val = data1;
next = NULL;
prev = NULL;
}
ListNode(int data1, ListNode *next1, ListNode *prev1)
{
val = data1;
next = next1;
prev = prev1;
}
};
// Solution class
class Solution {
public:
/* Function to insert a node before
head in a doubly linked list */
ListNode* insertBeforeHead(ListNode* head, int X) {
// Create new node which will be the new head
ListNode* newHead = new ListNode(X, head, nullptr);
// Point the current head back to new one
head->prev = newHead;
return newHead; // Return new head
}
};
// Helper Function to convert an array to a doubly linked list
ListNode* arrayToLinkedList(vector<int> &nums) {
// If array is empty, return nullptr
if (nums.empty()) return nullptr;
// Create head node with first element of the array
ListNode* head = new ListNode(nums[0]);
// Initialize 'prev' to the head node
ListNode* prev = head;
for (int i=1; i < nums.size(); i++) {
// Create a new node
ListNode* temp = new ListNode(nums[i], nullptr, prev);
// Update 'next' pointer
prev->next = temp;
// Move 'prev' to newly created node
prev = temp;
}
// Return head
return head;
}
// Helper Function to print the linked list
void printLL(ListNode* head) {
while (head != NULL) {
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
int main() {
vector<int> nums = {2, 3, 4, 5};
// Creating the doubly linked list from given array
ListNode* head = arrayToLinkedList(nums);
// Print the Original list
cout << "Original List: ";
printLL(head);
// Create an instance of Solution class
Solution sol;
/* Function call to insert a node before
head in a doubly linked list */
head = sol.insertBeforeHead(head, 1);
// Print the Modified list
cout << "Modified list: ";
printLL(head);
return 0;
}
// Definition of doubly linked list
class ListNode {
int val;
ListNode next;
ListNode prev;
ListNode() {
val = 0;
next = null;
prev = null;
}
ListNode(int data1) {
val = data1;
next = null;
prev = null;
}
ListNode(int data1, ListNode next1, ListNode prev1) {
val = data1;
next = next1;
prev = prev1;
}
}
// Solution class
class Solution {
/* Function to insert a node before
head in a doubly linked list */
public ListNode insertBeforeHead(ListNode head, int X) {
// Create new node which will be the new head
ListNode newHead = new ListNode(X, head, null);
// Point the current head back to new one
head.prev = newHead;
return newHead; // Return new head
}
}
// Main class
class Main {
// Helper Function to convert an array to a doubly linked list
private static ListNode arrayToLinkedList(int[] nums) {
// If array is empty, return null
if (nums.length == 0) return null;
// Create head node with first element of the array
ListNode head = new ListNode(nums[0]);
// Initialize 'prev' to the head node
ListNode prev = head;
for (int i = 1; i < nums.length; i++) {
// Create a new node
ListNode temp = new ListNode(nums[i], null, prev);
// Update 'next' pointer
prev.next = temp;
// Move 'prev' to newly created node
prev = temp;
}
// Return head
return head;
}
// Helper Function to print the linked list
private static void printLL(ListNode head) {
while (head != null) {
System.out.print(head.val + " ");
head = head.next;
}
System.out.println();
}
// main method
public static void main(String[] args) {
int[] nums = {2, 3, 4, 5};
// Creating the doubly linked list from given array
ListNode head = arrayToLinkedList(nums);
// Print the Original list
System.out.print("Original List: ");
printLL(head);
// Create an instance of Solution class
Solution sol = new Solution();
/* Function call to insert a node before
head in a doubly linked list */
head = sol.insertBeforeHead(head, 1);
// Print the Modified list
System.out.print("Modified list: ");
printLL(head);
}
}
# Definition of doubly linked list
class ListNode:
def __init__(self, data1=0, next1=None, prev1=None):
self.val = data1
self.next = next1
self.prev = prev1
# Solution class
class Solution:
''' Function to insert a node before
head in a doubly linked list '''
def insertBeforeHead(self, head, X):
# Create new node which will be the new head
newHead = ListNode(X, head, None)
# Point the current head back to new one
head.prev = newHead
return newHead # Return new head
# Helper Function to convert an array to a doubly linked list
def arrayToLinkedList(nums):
# If array is empty, return None
if not nums:
return None
# Create head node with first element of the array
head = ListNode(nums[0])
# Initialize 'prev' to the head node
prev = head
for i in range(1, len(nums)):
# Create a new node
temp = ListNode(nums[i], None, prev)
# Update 'next' pointer
prev.next = temp
# Move 'prev' to newly created node
prev = temp
# Return head
return head
# Helper Function to print the linked list
def printLL(head):
while head is not None:
print(head.val, end=" ")
head = head.next
print()
if __name__ == "__main__":
nums = [2, 3, 4, 5]
# Creating the doubly linked list from given array
head = arrayToLinkedList(nums)
# Print the Original list
print("Original List: ", end="")
printLL(head)
# Create an instance of Solution class
sol = Solution()
''' Function call to insert a node before
head in a doubly linked list '''
head = sol.insertBeforeHead(head, 1)
# Print the Modified list
print("Modified list: ", end="")
printLL(head)
// Definition of doubly linked list
class ListNode {
constructor(data1 = 0, next1 = null, prev1 = null) {
this.val = data1;
this.next = next1;
this.prev = prev1;
}
}
// Solution class
class Solution {
/* Function to insert a node before
head in a doubly linked list */
insertBeforeHead(head, X) {
// Create new node which will be the new head
let newHead = new ListNode(X, head, null);
// Point the current head back to new one
head.prev = newHead;
return newHead; // Return new head
}
}
// Helper Function to convert an array to a doubly linked list
function arrayToLinkedList(nums) {
// If array is empty, return null
if (nums.length === 0) return null;
// Create head node with first element of the array
let head = new ListNode(nums[0]);
// Initialize 'prev' to the head node
let prev = head;
for (let i = 1; i < nums.length; i++) {
// Create a new node
let temp = new ListNode(nums[i], null, prev);
// Update 'next' pointer
prev.next = temp;
// Move 'prev' to newly created node
prev = temp;
}
// Return head
return head;
}
// Helper Function to print the linked list
function printLL(head) {
while (head !== null) {
process.stdout.write(head.val + " ");
head = head.next;
}
console.log();
}
const main = () => {
const nums = [2, 3, 4, 5];
// Creating the doubly linked list from given array
let head = arrayToLinkedList(nums);
// Print the Original list
console.log("Original List: ");
printLL(head);
// Create an instance of Solution class
let sol = new Solution();
/* Function call to insert a node before
head in a doubly linked list */
head = sol.insertBeforeHead(head, 1);
// Print the Modified list
console.log("Modified list: ");
printLL(head);
}
main();
Q: Can we modify this to insert before any node in the list?
A: Yes, by adjusting prev and next pointers accordingly.
Q: Why do we update prev of the current head?
A: To maintain backward linkage, ensuring bidirectional traversal remains intact.
Q: How would you modify this for a circular doubly linked list?
A: Update the new node’s prev to the tail and tail’s next to the new head.
Q: How can we make this thread-safe in concurrent environments?
A: Use locking mechanisms to prevent simultaneous modification issues.