使用递归方法在给定的链表中从末尾查找第n个节点。
例子:
Input : list: 4->2->1->5->3
n = 2
Output : 5
算法:
findNthFromLast(head, n, count, nth_last)
if head == NULL then
return
findNthFromLast(head->next, n, count, nth_last)
count = count + 1
if count == n then
nth_last = head
findNthFromLastUtil(head, n)
Initialize nth_last = NULL
Initialize count = 0
findNthFromLast(head, n, &count, &nth_last)
if nth_last != NULL then
print nth_last->data
else
print "Node does not exists"
注意:参数count和nth_last将是findNthFromLast()中的指针变量。
C++
// C++ implementation to recursively find the nth node from
// the last of the linked list
#include
using namespace std;
// structure of a node of a linked list
struct Node {
int data;
Node* next;
};
// function to get a new node
Node* getNode(int data)
{
// allocate space
Node* newNode = new Node;
// put in data
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// funnction to recursively find the nth node from
// the last of the linked list
void findNthFromLast(Node* head, int n, int* count,
Node** nth_last)
{
// if list is empty
if (!head)
return;
// recursive call
findNthFromLast(head->next, n, count, nth_last);
// increment count
*count = *count + 1;
// if true, then head is the nth node from the last
if (*count == n)
*nth_last = head;
}
// utility function to find the nth node from
// the last of the linked list
void findNthFromLastUtil(Node* head, int n)
{
// Initialize
Node* nth_last = NULL;
int count = 0;
// find nth node from the last
findNthFromLast(head, n, &count, &nth_last);
// if node exists, then print it
if (nth_last != NULL)
cout << "Nth node from last is: "
<< nth_last->data;
else
cout << "Node does not exists";
}
// Driver program to test above
int main()
{
// linked list: 4->2->1->5->3
Node* head = getNode(4);
head->next = getNode(2);
head->next->next = getNode(1);
head->next->next->next = getNode(5);
head->next->next->next->next = getNode(3);
int n = 2;
findNthFromLastUtil(head, n);
return 0;
}
Java
// Java implementation to recursively
// find the nth node from the last
// of the linked list
import java.util.*;
class GFG
{
static int count = 0, data = 0;
// a node of a linked list
static class Node
{
int data;
Node next;
}
// function to get a new node
static Node getNode(int data)
{
// allocate space
Node newNode = new Node();
// put in data
newNode.data = data;
newNode.next = null;
return newNode;
}
// funnction to recursively
// find the nth node from
// the last of the linked list
static void findNthFromLast(Node head, int n,
Node nth_last)
{
// if list is empty
if (head == null)
return;
// recursive call
findNthFromLast(head.next, n, nth_last);
// increment count
count = count + 1;
// if true, then head is the
// nth node from the last
if (count == n)
{
data = head.data;
}
}
// utility function to find
// the nth node from the last
// of the linked list
static void findNthFromLastUtil(Node head, int n)
{
// Initialize
Node nth_last = new Node();
count = 0;
// find nth node from the last
findNthFromLast(head, n, nth_last);
// if node exists, then print it
if (nth_last != null)
System.out.println("Nth node from last is: " +
data);
else
System.out.println("Node does not exists");
}
// Driver Code
public static void main(String args[])
{
// linked list: 4.2.1.5.3
Node head = getNode(4);
head.next = getNode(2);
head.next.next = getNode(1);
head.next.next.next = getNode(5);
head.next.next.next.next = getNode(3);
int n = 2;
findNthFromLastUtil(head, n);
}
}
// This code is contributed
// by Arnab Kundu
Python
# Python implementation to recursively
# find the nth node from the last
# of the linked list
count = 0
data = 0
# a node of a linked list
class Node(object):
def __init__(self, d):
self.data = d
self.next = None
# function to get a new node
def getNode(data):
# allocate space
newNode = Node(0)
# put in data
newNode.data = data
newNode.next = None
return newNode
# funnction to recursively
# find the nth node from
# the last of the linked list
def findNthFromLast(head, n, nth_last) :
global count
global data
# if list is empty
if (head == None):
return
# recursive call
findNthFromLast(head.next, n, nth_last)
# increment count
count = count + 1
# if true, then head is the
# nth node from the last
if (count == n) :
data = head.data
# utility function to find
# the nth node from the last
# of the linked list
def findNthFromLastUtil(head, n) :
global count
global data
# Initialize
nth_last = Node(0)
count = 0
# find nth node from the last
findNthFromLast(head, n, nth_last)
# if node exists, then print it
if (nth_last != None) :
print("Nth node from last is: " , data)
else:
print("Node does not exists")
# Driver Code
# linked list: 4.2.1.5.3
head = getNode(4)
head.next = getNode(2)
head.next.next = getNode(1)
head.next.next.next = getNode(5)
head.next.next.next.next = getNode(3)
n = 2
findNthFromLastUtil(head, n)
# This code is contributed
# by Arnab Kundu
C#
// C# implementation to recursively
// find the nth node from the last
// of the linked list
using System;
public class GFG
{
static int count = 0, data = 0;
// a node of a linked list
class Node
{
public int data;
public Node next;
}
// function to get a new node
static Node getNode(int data)
{
// allocate space
Node newNode = new Node();
// put in data
newNode.data = data;
newNode.next = null;
return newNode;
}
// funnction to recursively
// find the nth node from
// the last of the linked list
static void findNthFromLast(Node head, int n,
Node nth_last)
{
// if list is empty
if (head == null)
return;
// recursive call
findNthFromLast(head.next, n, nth_last);
// increment count
count = count + 1;
// if true, then head is the
// nth node from the last
if (count == n)
{
data = head.data;
}
}
// utility function to find
// the nth node from the last
// of the linked list
static void findNthFromLastUtil(Node head, int n)
{
// Initialize
Node nth_last = new Node();
count = 0;
// find nth node from the last
findNthFromLast(head, n, nth_last);
// if node exists, then print it
if (nth_last != null)
Console.WriteLine("Nth node from last is: " +
data);
else
Console.WriteLine("Node does not exists");
}
// Driver Code
public static void Main(String []args)
{
// linked list: 4.2.1.5.3
Node head = getNode(4);
head.next = getNode(2);
head.next.next = getNode(1);
head.next.next.next = getNode(5);
head.next.next.next.next = getNode(3);
int n = 2;
findNthFromLastUtil(head, n);
}
}
// This code is contributed by Rajput-Ji
输出:
Nth node from last is: 5
时间复杂度: O(n),其中“ n”是链表中节点的数量。