Given a Singly Linked List, starting from the second node delete all alternate nodes of it. For example, if the given linked list is 1->2->3->4->5 then your function should convert it to 1->3->5, and if the given linked list is 1->2->3->4 then convert it to 1->3.
Method 1 (Iterative):
Keep track of previous of the node to be deleted. First, change the next link of the previous node and iteratively move to the next node.
Python3
import math
class Node:
def __init__( self , data):
self .data = data
self . next = None
def deleteAlt(head):
if (head = = None ):
return
prev = head
now = head. next
while (prev ! = None and
now ! = None ):
prev. next = now. next
now = None
prev = prev. next
if (prev ! = None ):
now = prev. next
def push(head_ref, new_data):
new_node = Node(new_data)
new_node.data = new_data
new_node. next = head_ref
head_ref = new_node
return head_ref
def printList(node):
while (node ! = None ):
print (node.data, end = " " )
node = node. next
if __name__ = = '__main__' :
head = None
head = push(head, 5 )
head = push(head, 4 )
head = push(head, 3 )
head = push(head, 2 )
head = push(head, 1 )
print ( "List before calling deleteAlt() " )
printList(head)
deleteAlt(head)
print ( "List after calling deleteAlt() " )
printList(head)
|
Output:
List before calling deleteAlt()
1 2 3 4 5
List after calling deleteAlt()
1 3 5
Time Complexity: O(n) where n is the number of nodes in the given Linked List.
Auxiliary Space: O(1) because it is using constant space
Method 2 (Recursive):
Recursive code uses the same approach as method 1. The recursive code is simple and short but causes O(n) recursive function calls for a linked list of size n.
Python3
def deleteAlt(head):
if (head = = None ):
return
node = head. next
if (node = = None ):
return
head. next = node. next
free(node)
deleteAlt(head. next )
|
Time Complexity: O(n)
Auxiliary space: O(n) for call stack because using recursion
Please refer complete article on Delete alternate nodes of a Linked List for more details!