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

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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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 `

## 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 `

Output:

```29
```

Time complexity : O(n)

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.