Java 程序:从链表末尾查找第n个节点

原文:https://www.studytonight.com/java-programs/java-program-to-find-nth-node-from-end-of-linked-list

在本教程中,我们将看到如何在 java 中从链表的末尾找到第 n 个节点。LinkedList 是一种线性数据结构,其中元素不存储在连续的位置,每个元素都是一个单独的对象,具有数据部分和地址部分。每个元素都被称为一个节点。由于插入和删除的动态性和容易性,它们比数组更受欢迎。但是在继续之前,如果你不熟悉 java 中链表的概念,那么一定要查看一下 Java 中链表上的文章。

输入:输入链表元素:6 7 8 4 5 1 3 2 5

输出:链表末尾的第 6 个节点是:4

这可以通过使用以下方法来实现:

方法 1:使用链表的长度。

方法 2:使用两点概念。

让我们看看这些方法中的每一种,以便更好地理解。

Java 程序:程序 1:从链表末尾找到第 n 个节点

在这个程序中,我们将看到如何使用链表的长度在 java 中从链表的末尾找到第 n 个节点。

算法:

  1. 开始
  2. 使用链表数据结构创建String类型的链表。
  3. 现在向链表添加节点。
  4. 调用用户定义的函数,从链表的末尾开始计算第 n 个节点。
  5. 首先,计算链表的长度。
  6. 现在,打印链表开头的第(length–n+1)个节点。
  7. 停止

让我们看看下面的例子,以更好地理解上述算法。

//Java program to find nth node from end of linked list
public class LinkedList 
{
    Node head; 
    class Node 
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
    void printNthFromEnd(int n)
    {
        int len = 0;
        Node temp = head;
        while (temp != null) 
        {
            temp = temp.next;
            len++;
        }
        if (len < n)
            return;
        temp = head;
        for (int i = 1; i < len - n + 1; i++)
            temp = temp.next;
        System.out.println(n+"th node from the end is "+temp.data);
    }
    public void add(int newData)
    {
        Node newNode = new Node(newData);
        newNode.next = head;
        head = newNode;
    }
    public static void main(String[] args)
    {
        LinkedList ll = new LinkedList();
        ll.add(12);
        ll.add(8);
        ll.add(21);
        ll.add(96);
        ll.add(52);
        ll.add(27);
        ll.add(14);
        ll.printNthFromEnd(6);
    }
}

距终点第 6 个节点是 27

Java 程序:程序 2:从链表末尾找到第 n 个节点

在这个程序中,我们将看到如何使用两个指针在 java 中从链表的末尾找到第 n 个节点。

算法:

  1. 开始
  2. 使用链表数据结构创建String类型的链表。
  3. 现在向链表添加节点。
  4. 调用用户定义的函数,从链表的末尾开始计算第 n 个节点。
  5. 声明两个指针:指针 1 和指针 2。
  6. 初始化指向 head 的两个指针。
  7. 首先,将第一个指针从头部移动到 n 个节点。
  8. 现在逐个移动两个指针,直到引用指针到达末尾。
  9. 现在第二个指针将从末尾指向第 n 个节点。
  10. 返回第二个指针。
  11. 显示结果。
  12. 停止

让我们看看下面的例子,以更好地理解上述算法。

//Java program to find nth node from end of linked list
public class LinkedList 
{
    Node head; 
    class Node 
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
    void printNthFromEnd(int n)
    {
        Node ptr1 = head;
        Node ptr2 = head;

        int count = 0;
        if (head != null)
        {
            while (count < n)
            {
                if (ptr2 == null)
                {
                    System.out.println(n+ " is greater than the number of nodes in the list");
                    return;
                }
                ptr2 = ptr2.next;
                count++;
            }

            if(ptr2 == null)
            {
              head = head.next;
              if(head != null)
                System.out.println(n +"th node from the last is "+head.data);
            }
            else
            {

              while (ptr2 != null)
              {
                  ptr1 = ptr1.next;
                  ptr2 = ptr2.next;
              }
              System.out.println(n +"th node from the last is "+ptr1.data);
            }
        }

    }
    public void add(int newData)
    {
        Node newNode = new Node(newData);
        newNode.next = head;
        head = newNode;
    }
    public static void main(String[] args)
    {
        LinkedList ll = new LinkedList();
        ll.add(12);
        ll.add(8);
         ll.add(42);
        ll.add(29);
        ll.add(32);
        ll.add(87);
        ll.add(53);
        ll.printNthFromEnd(4);
    }
}

倒数第 4 个节点是 29