The idea is to reverse the links of all nodes using three pointers:
prev: pointer to keep track of the previous node
curr: pointer to keep track of the current node
next: pointer to keep track of the next node
Starting from the first node, initialize curr with the head of linked list and next with the next node of curr. Update the next pointer of curr with prev. Finally, move the three pointer by updating prev with curr and curr with next.
Python
classNode:# Constructor to initialize the node objectdef__init__(self,data):self.data=dataself.next=NoneclassLinkedList:# Function to initialize headdef__init__(self):self.head=None# Function to reverse the linked listdefreverse(self):prev=Nonecurrent=self.headwhile(currentisnotNone):next=current.nextcurrent.next=prevprev=currentcurrent=nextself.head=prev# Function to insert a new node at the beginningdefpush(self,new_data):new_node=Node(new_data)new_node.next=self.headself.head=new_node# Utility function to print the LinkedListdefprintList(self):temp=self.headwhile(temp):print(temp.data,end=" ")temp=temp.next# Driver program to test above functionsllist=LinkedList()llist.push(20)llist.push(4)llist.push(15)llist.push(85)print("Given Linked List")llist.printList()llist.reverse()print("\nReversed Linked List")llist.printList()
classNode:
# Constructor to initialize the node object
def__init__(self, data):
self.data=data
self.next=None
classLinkedList:
# Function to initialize head
def__init__(self):
self.head=None
# Function to reverse the linked list
defreverse(self):
prev=None
current=self.head
while(currentisnotNone):
next=current.next
current.next=prev
prev=current
current=next
self.head=prev
# Function to insert a new node at the beginning
defpush(self, new_data):
new_node=Node(new_data)
new_node.next=self.head
self.head=new_node
# Utility function to print the LinkedList
defprintList(self):
temp=self.head
while(temp):
print (temp.data,end=" ")
temp=temp.next
# Driver program to test above functions
llist=LinkedList()
llist.push(20)
llist.push(4)
llist.push(15)
llist.push(85)
print ("Given Linked List")
llist.printList()
llist.reverse()
print ("\nReversed Linked List")
llist.printList()
Output
Given Linked List
85 15 4 20
Reversed Linked List
20 4 15 85
Time Complexity: O(N)
Auxiliary Space: O(1)
2. A Simpler and Tail Recursive Method
The idea is to reach the last node of the linked list using recursion then start reversing the linked list from the last node.
Python
classNode:# Constructor to initialize the node objectdef__init__(self,data):self.data=dataself.next=NoneclassLinkedList:# Function to initialize headdef__init__(self):self.head=NonedefreverseUtil(self,curr,prev):# If last node mark it headifcurr.nextisNone:self.head=curr# Update next to prev nodecurr.next=prevreturn# Save curr.next node for recursive callnext=curr.next# And update nextcurr.next=prevself.reverseUtil(next,curr)# This function mainly calls reverseUtil()# with previous as Nonedefreverse(self):ifself.headisNone:returnself.reverseUtil(self.head,None)# Function to insert a new node at the beginningdefpush(self,new_data):new_node=Node(new_data)new_node.next=self.headself.head=new_node# Utility function to print the LinkedListdefprintList(self):temp=self.headwhile(temp):print(temp.data,end=" ")temp=temp.next# Driver programllist=LinkedList()llist.push(8)llist.push(7)llist.push(6)llist.push(5)llist.push(4)llist.push(3)llist.push(2)llist.push(1)print("Given linked list")llist.printList()llist.reverse()print("\nReverse linked list")llist.printList()
classNode:
# Constructor to initialize the node object
def__init__(self, data):
self.data=data
self.next=None
classLinkedList:
# Function to initialize head
def__init__(self):
self.head=None
defreverseUtil(self, curr, prev):
# If last node mark it head
ifcurr.nextisNone:
self.head=curr
# Update next to prev node
curr.next=prev
return
# Save curr.next node for recursive call
next=curr.next
# And update next
curr.next=prev
self.reverseUtil(next, curr)
# This function mainly calls reverseUtil()
# with previous as None
defreverse(self):
ifself.headisNone:
return
self.reverseUtil(self.head, None)
# Function to insert a new node at the beginning
defpush(self, new_data):
new_node=Node(new_data)
new_node.next=self.head
self.head=new_node
# Utility function to print the LinkedList
defprintList(self):
temp=self.head
while(temp):
print(temp.data,end=" ")
temp=temp.next
# Driver program
llist=LinkedList()
llist.push(8)
llist.push(7)
llist.push(6)
llist.push(5)
llist.push(4)
llist.push(3)
llist.push(2)
llist.push(1)
print("Given linked list")
llist.printList()
llist.reverse()
print("\nReverse linked list")
llist.printList()
Output
Given linked list
1 2 3 4 5 6 7 8
Reverse linked list
8 7 6 5 4 3 2 1
We use cookies to ensure you have the best browsing experience on our website. By using our site, you
acknowledge that you have read and understood our
Cookie Policy &
Privacy Policy
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.