Skip to content
geeksforgeeks
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • Tutorials
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
  • Practice
    • Build your AI Agent
    • GfG 160
    • Problem of the Day
    • Practice Coding Problems
    • GfG SDE Sheet
  • Contests
    • Accenture Hackathon (Ending Soon!)
    • GfG Weekly [Rated Contest]
    • Job-A-Thon Hiring Challenge
    • All Contests and Events
  • Python Tutorial
  • Interview Questions
  • Python Quiz
  • Python Glossary
  • Python Projects
  • Practice Python
  • Data Science With Python
  • Python Web Dev
  • DSA with Python
  • Python OOPs
Open In App
Next Article:
Python Program For Selecting A Random Node From A Singly Linked List
Next article icon

Python Program For Reversing Alternate K Nodes In A Singly Linked List

Last Updated : 22 Mar, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a linked list, write a function to reverse every alternate k nodes (where k is an input to the function) in an efficient way. Give the complexity of your algorithm.

Example: 

Inputs:   1->2->3->4->5->6->7->8->9->NULL and k = 3 Output:   3->2->1->4->5->6->9->8->7->NULL. 

Method 1 (Process 2k nodes and recursively call for rest of the list): 
This method is basically an extension of the method discussed in this post. 

kAltReverse(struct node *head, int k)   1)  Reverse first k nodes.   2)  In the modified list head points to the kth node.  So change next         of head to (k+1)th node   3)  Move the current pointer to skip next k nodes.   4)  Call the kAltReverse() recursively for rest of the n - 2k nodes.   5)  Return new head of the list.
Python3
# Python3 program to reverse alternate # k nodes in a linked list import math  # Link list node  class Node:      def __init__(self, data):          self.data = data          self.next = None  # Reverses alternate k nodes and  #returns the pointer to the new  # head node  def kAltReverse(head, k) :      current = head      next = None     prev = None     count = 0      # 1) reverse first k nodes of the      # linked list      while (current != None and             count < k) :          next = current.next         current.next = prev          prev = current          current = next         count = count + 1;          # 2) Now head pos to the kth node.      # So change next of head to (k+1)th node     if(head != None):          head.next = current       # 3) We do not want to reverse next k      # nodes. So move the current      # pointer to skip next k nodes      count = 0     while(count < k - 1 and            current != None ):          current = current.next         count = count + 1          # 4) Recursively call for the list      # starting from current.next. And make     # rest of the list as next of first node      if(current != None):          current.next =                  kAltReverse(current.next, k)       # 5) prev is the new head of the      # input list      return prev   # UTILITY FUNCTIONS  # Function to push a node  def push(head_ref, new_data):           # Allocate node      new_node = Node(new_data)      # Put in the data      # new_node.data = new_data       # Link the old list of the      # new node      new_node.next = head_ref       # Move the head to point to the      # new node      head_ref = new_node          return head_ref  # Function to print linked list  def printList(node):      count = 0     while(node != None):          print(node.data, end = " ")          node = node.next         count = count + 1      # Driver code if __name__=='__main__':          # Start with the empty list      head = None      # Create a list      # 1.2.3.4.5...... .20      for i in range(20, 0, -1):         head = push(head, i)               print("Given linked list ")      printList(head)      head = kAltReverse(head, 3)       print("Modified Linked list")      printList(head)  # This code is contributed by Srathore 

Output: 

Given linked list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Modified Linked list 3 2 1 4 5 6 9 8 7 10 11 12 15 14 13 16 17 18 20 19

Time Complexity: O(n)

Auxiliary Space: O(n) due to recursive stack space

Method 2 (Process k nodes and recursively call for rest of the list): 
The method 1 reverses the first k node and then moves the pointer to k nodes ahead. So method 1 uses two while loops and processes 2k nodes in one recursive call. 

This method processes only k nodes in a recursive call. It uses a third bool parameter b which decides whether to reverse the k elements or simply move the pointer.  

_kAltReverse(struct node *head, int k, bool b)   1)  If b is true, then reverse first k nodes.   2)  If b is false, then move the pointer k nodes ahead.   3)  Call the kAltReverse() recursively for rest of the n - k nodes and link         rest of the modified list with end of first k nodes.    4)  Return new head of the list.
Python3
# Python code for above algorithm  # Link list node  class node:          def __init__(self, data):          self.data = data          self.next = next          # Function to insert a node at the # beginning of the linked list def push(head_ref, new_data):      # Allocate node      new_node = node(0)      # Put in the data      new_node.data = new_data      # Link the old list to the      # new node      new_node.next = (head_ref)      # Move the head to point to the      # new node      (head_ref) = new_node          return head_ref      """ Alternatively reverses the given      linked list in groups of given      size k. """ def kAltReverse(head, k) :     return _kAltReverse(head, k, True)   """ Helper function for kAltReverse().      It reverses k nodes of the list only      if the third parameter b is passed as      True, otherwise moves the pointer k      nodes ahead and recursively call itself """ def _kAltReverse(Node, k, b) :     if(Node == None) :         return None          count = 1     prev = None     current = Node      next = None          """ The loop serves two purposes          1) If b is True,          then it reverses the k nodes          2) If b is false,          then it moves the current pointer """     while(current != None and count <= k) :              next = current.next              """ Reverse the nodes only if b              is True """         if(b == True) :             current.next = prev                           prev = current          current = next         count = count + 1                   """ 3) If b is True, then node is the          kth node. So attach rest of the list          after node.          4) After attaching, return the new          head """     if(b == True) :              Node.next =              _kAltReverse(current,                           k, not b)          return prev                   else :          """ If b is not True, then attach              rest of the list after prev.              So attach rest of the list              after prev """         prev.next = _kAltReverse(current,                                   k, not b)          return Node           """ Function to print linked list """ def printList(node) :      count = 0     while(node != None) :              print( node.data, end = " ")          node = node.next         count = count + 1  # Driver Code  # Start with the empty list  head = None i = 20  # Create a list  # 1->2->3->4->5...... ->20  while(i > 0 ):      head = push(head, i)      i = i - 1  print("Given linked list ")  printList(head)  head = kAltReverse(head, 3)   print("Modified Linked list ")  printList(head)  # This code is contributed by Arnab Kundu 

Output: 

Given linked list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Modified Linked list 3 2 1 4 5 6 9 8 7 10 11 12 15 14 13 16 17 18 20 19

Time Complexity: O(n) 

Auxiliary Space: O(n) For call stack because it is using recursion

Please refer complete article on Reverse alternate K nodes in a Singly Linked List for more details!
 


Next Article
Python Program For Selecting A Random Node From A Singly Linked List
author
kartik
Improve
Article Tags :
  • Linked List
  • Python
  • Python Programs
  • DSA
  • Linked Lists
  • Reverse
  • Python-DSA
Practice Tags :
  • Linked List
  • python
  • Reverse

Similar Reads

  • Python Program For Selecting A Random Node From A Singly Linked List
    Given a singly linked list, select a random node from the linked list (the probability of picking a node should be 1/N if there are N nodes in the list). You are given a random number generator.Below is a Simple Solution: Count the number of nodes by traversing the list.Traverse the list again and s
    4 min read
  • Python Program For Swapping Nodes In A Linked List Without Swapping Data
    Given a linked list and two keys in it, swap nodes for two given keys. Nodes should be swapped by changing links. Swapping data of nodes may be expensive in many situations when data contains many fields. It may be assumed that all keys in the linked list are distinct. Examples: Input : 10->15-
    5 min read
  • Python Program For Alternating Split Of A Given Singly Linked List- Set 1
    Write a function AlternatingSplit() that takes one list and divides up its nodes to make two smaller lists 'a' and 'b'. The sublists should be made from alternating elements in the original list. So if the original list is 0->1->0->1->0->1 then one sublist should be 0->0->0 and
    3 min read
  • Python Program For Reversing A Doubly Linked List
    Given a Doubly Linked List, the task is to reverse the given Doubly Linked List. See below diagrams for example.  (a) Original Doubly Linked List (b) Reversed Doubly Linked List Here is a simple method for reversing a Doubly Linked List. All we need to do is swap prev and next pointers for all nodes
    4 min read
  • Python Program for Deleting a Node in a Linked List
    We have discussed Linked List Introduction and Linked List Insertion in previous posts on a singly linked list.Let us formulate the problem statement to understand the deletion process. Given a 'key', delete the first occurrence of this key in the linked list. Iterative Method:To delete a node from
    3 min read
  • Python Program For Reversing A Linked List In Groups Of Given Size - Set 1
    Given a linked list, write a function to reverse every k nodes (where k is an input to the function).  Example:  Input: 1->2->3->4->5->6->7->8->NULL, K = 3 Output: 3->2->1->6->5->4->8->7->NULL Input: 1->2->3->4->5->6->7->8->NULL, K = 5 Output: 5->4->3->2->1->8->7->6->NULL  Recommended: Please solve
    3 min read
  • Python Program For Reversing A Linked List In Groups Of Given Size- Set 2
    Given a linked list, write a function to reverse every k nodes (where k is an input to the function). Examples: Input: 1->2->3->4->5->6->7->8->NULL and k = 3 Output: 3->2->1->6->5->4->8->7->NULL. Input: 1->2->3->4->5->6->7->8->NULL and k = 5 Output: 5->4->3->2->1->8->7->6->NULL. Recommended: Please
    3 min read
  • Python Program For Rearranging A Given Linked List In-Place
    Given a singly linked list L0 -> L1 -> … -> Ln-1 -> Ln. Rearrange the nodes in the list so that the new formed list is: L0 -> Ln -> L1 -> Ln-1 -> L2 -> Ln-2 ...You are required to do this in place without altering the nodes' values. Examples: Input: 1 -> 2 -> 3 ->
    7 min read
  • Python Program For Removing Every K-th Node Of The Linked List
    Given a singly linked list, Your task is to remove every K-th node of the linked list. Assume that K is always less than or equal to length of Linked List.Examples : Input: 1->2->3->4->5->6->7->8 k = 3 Output: 1->2->4->5->7->8 As 3 is the k-th node after its deletion list would be 1->2->4->5->6->7->
    3 min read
  • Python Program To Delete Alternate Nodes Of A Linked List
    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. Recomm
    3 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
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
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences