📌  相关文章
📜  在单次遍历中找到链表的倒数第二个节点

📅  最后修改于: 2022-05-13 01:57:05.015000             🧑  作者: Mango

在单次遍历中找到链表的倒数第二个节点

给定一个链表。任务是仅使用单次遍历找到链表的倒数第二个节点。
例子:

这个想法是按照以下方法遍历链表:

  1. 如果列表为空或包含少于 2 个元素,则返回 false。
  2. 否则检查当前节点是否是链表的倒数第二个节点。也就是说,如果 (current_node->next-next == NULL )那么当前节点是倒数第二个节点。
  3. 如果当前节点是倒数第二个节点,则打印该节点,否则移动到下一个节点。
  4. 重复以上两个步骤,直到到达倒数第二个节点。

下面是上述方法的实现:

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


输出:
29

时间复杂度: O(n)