# Find the second last node of a linked list in single traversal

• Last Updated : 09 Jun, 2021

Given a linked list. The task is to find the second last node of the linked list using a single traversal only.
Examples:

Input : List = 1 -> 2 -> 3 -> 4 -> 5 -> NULL
Output : 4
Input : List = 2 -> 4 -> 6 -> 8 -> 33 -> 67 -> NULL
Output : 33

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

The idea is to traverse the linked list following the below approach:

1. If the list is empty or contains less than 2 elements, return false.
2. Otherwise check if the current node is the second last node of the linked list or not. That is, if (current_node->next-next == NULL ) then the current node is the second last node.
3. If the current node is the second last node, print the node otherwise move to the next node.
4. Repeat the above two steps until the second last node is reached.

Below is the implementation of the above approach:

## C++

 `// C++ program to find the second last node``// of a linked list in single traversal` `#include ``using` `namespace` `std;` `// Link list node``struct` `Node {``    ``int` `data;``    ``struct` `Node* next;``};` `// Function to find the second last``// node of the linked list``int` `findSecondLastNode(``struct` `Node* head)``{``    ``struct` `Node* temp = head;` `    ``// If the list is empty or contains less``    ``// than 2 nodes``    ``if` `(temp == NULL || temp->next == NULL)``        ``return` `-1;` `    ``// Traverse the linked list``    ``while` `(temp != NULL) {` `        ``// Check if the current node  is the``        ``// second last node or not``        ``if` `(temp->next->next == NULL)``            ``return` `temp->data;` `        ``// If not then move to the next node``        ``temp = temp->next;``    ``}``}` `// Function to push node at head``void` `push(``struct` `Node** head_ref, ``int` `new_data)``{``    ``Node* new_node = ``new` `Node;``    ``new_node->data = new_data;``    ``new_node->next = (*head_ref);``    ``(*head_ref) = new_node;``}` `// Driver code``int` `main()``{``    ``/* Start with the empty list */``    ``struct` `Node* head = NULL;` `    ``/* Use push() function to construct``    ``the below list 8 -> 23 -> 11 -> 29 -> 12 */``    ``push(&head, 12);``    ``push(&head, 29);``    ``push(&head, 11);``    ``push(&head, 23);``    ``push(&head, 8);` `    ``cout << findSecondLastNode(head);` `    ``return` `0;``}`

## Java

 `// Java program to find the second last node``// of a linked list in single traversal` `// Linked list node``class` `Node``{``    ``int` `data;``    ``Node next;``    ``Node(``int` `d)``    ``{``        ``this``.data = d;``        ``this``.next = ``null``;``    ``}``}``class` `LinkedList``{``    ``Node start;``    ``LinkedList()``    ``{``        ``start = ``null``;``    ``}``    ` `    ``// Function to push node at head``    ``public` `void` `push(``int` `data)``    ``{``        ``if``(``this``.start == ``null``)``        ``{``        ``Node temp = ``new` `Node(data);``        ``this``.start = temp;``        ``}``        ``else``        ``{``            ``Node temp = ``new` `Node(data);``            ``temp.next = ``this``.start;``            ``this``.start = temp;``        ``}``    ``}``    ` `    ``// method to find the second last``    ``// node of the linked list``    ``public` `int` `findSecondLastNode(Node ptr)``    ``{``        ``Node temp = ptr;``        ` `        ``// If the list is empty or contains less``        ``// than 2 nodes``        ``if``(temp == ``null` `|| temp.next == ``null``)``            ``return` `-``1``;``    ` `            ``// This loop stops at second last node``        ``while``(temp.next.next != ``null``)``        ``{``            ``temp = temp.next;``        ``}``        ``return` `temp.data;``    ``}``    ` `    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``LinkedList ll = ``new` `LinkedList();``        ` `        ``/* Use push() function to construct``        ``the below list 8 -> 23 -> 11 -> 29 -> 12 */``        ``ll.push(``12``);``        ``ll.push(``29``);``        ``ll.push(``11``);``        ``ll.push(``23``);``        ``ll.push(``8``);``        ``System.out.println(ll.findSecondLastNode(ll.start));``    ``}``}` `// This code is Contributed by Adarsh_Verma`

## Python3

 `# Python3 program to find the second last node``# of a linked list in single traversal``import` `math` `# Link list node``class` `Node:``    ``def` `__init__(``self``, data):``        ``self``.data ``=` `data``        ``self``.``next` `=` `None` `# Function to find the second last``# node of the linked list``def` `findSecondLastNode(head):``    ``temp ``=` `head` `    ``# If the list is empty or``    ``# contains less than 2 nodes``    ``if` `(temp ``=``=` `None` `or` `temp.``next` `=``=` `None``):``        ``return` `-``1` `    ``# Traverse the linked list``    ``while` `(temp !``=` `None``):` `        ``# Check if the current node is the``        ``# second last node or not``        ``if` `(temp.``next``.``next` `=``=` `None``):``            ``return` `temp.data``            ` `        ``# If not then move to the next node``        ``temp ``=` `temp.``next` `# Function to push node at head``def` `push(head, new_data):``    ``new_node ``=` `Node(new_data)``    ``#new_node.data = new_data``    ``new_node.``next` `=` `head``    ``head ``=` `new_node``    ``return` `head` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``# Start with the empty list``    ``head ``=` `None` `    ``# Use push() function to construct``    ``# the below list 8 . 23 . 11 . 29 . 12``    ``head ``=` `push(head, ``12``)``    ``head ``=` `push(head, ``29``)``    ``head ``=` `push(head, ``11``)``    ``head ``=` `push(head, ``23``)``    ``head ``=` `push(head, ``8``)` `    ``print``(findSecondLastNode(head))` `# This code is contributed by Srathore`

## C#

 `// C# program to find the second last node``// of a linked list in single traversal``using` `System;` `// Linked list node``public` `class` `Node``{``    ``public` `int` `data;``    ``public` `Node next;``    ``public` `Node(``int` `d)``    ``{``        ``this``.data = d;``        ``this``.next = ``null``;``    ``}``}``public` `class` `LinkedList``{``    ``Node start;``    ``LinkedList()``    ``{``        ``start = ``null``;``    ``}``    ` `    ``// Function to push node at head``    ``public` `void` `push(``int` `data)``    ``{``        ``if``(``this``.start == ``null``)``        ``{``        ``Node temp = ``new` `Node(data);``        ``this``.start = temp;``        ``}``        ``else``        ``{``            ``Node temp = ``new` `Node(data);``            ``temp.next = ``this``.start;``            ``this``.start = temp;``        ``}``    ``}``    ` `    ``// method to find the second last``    ``// node of the linked list``    ``public` `int` `findSecondLastNode(Node ptr)``    ``{``        ``Node temp = ptr;``        ` `        ``// If the list is empty or contains less``        ``// than 2 nodes``        ``if``(temp == ``null` `|| temp.next == ``null``)``            ``return` `-1;``    ` `            ``// This loop stops at second last node``        ``while``(temp.next.next != ``null``)``        ``{``            ``temp = temp.next;``        ``}``        ``return` `temp.data;``    ``}``    ` `    ``// Driver code``    ``public` `static` `void` `Main()``    ``{``        ``LinkedList ll = ``new` `LinkedList();``        ` `        ``/* Use push() function to construct``        ``the below list 8 -> 23 -> 11 -> 29 -> 12 */``        ``ll.push(12);``        ``ll.push(29);``        ``ll.push(11);``        ``ll.push(23);``        ``ll.push(8);``        ``Console.WriteLine(ll.findSecondLastNode(ll.start));``    ``}``}` `// This code is contributed by PrinciRaj1992`

## Javascript

 ``
Output:
`29`

Time complexity : O(n)

My Personal Notes arrow_drop_up