📜  逆序打印链表的最后k个节点|迭代方法

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

逆序打印链表的最后k个节点|迭代方法

给定一个包含 N 个节点和一个正整数 K 的链表,其中 K 应该小于或等于 N。任务是以相反的顺序打印列表的最后 K 个节点。

例子:

Input : list: 1->2->3->4->5, K = 2
Output : 5 4

Input : list: 3->10->6->9->12->2->8, K = 4
Output : 8 2 12 9

上一篇文章中讨论的解决方案使用递归方法。下面的文章讨论了解决上述问题的三种迭代方法。

方法1:想法是使用堆栈数据结构。将所有链表节点数据值推送到堆栈并弹出前K个元素并打印它们。

以下是上述方法的实现:

C++
// C++ implementation to print the last k nodes
// of linked list in reverse order
#include 
using namespace std;
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
void printLastKRev(Node* head, int k)
{
    // if list is empty
    if (!head)
        return;
 
    // Stack to store data value of nodes.
    stack st;
 
    // Push data value of nodes to stack
    while (head) {
        st.push(head->data);
        head = head->next;
    }
 
    int cnt = 0;
 
    // Pop first k elements of stack and
    // print them.
    while (cnt < k) {
        cout << st.top() << " ";
        st.pop();
        cnt++;
    }
}
 
// Driver code
int main()
{
    // Create list: 1->2->3->4->5
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
 
    return 0;
}


Java
// Java implementation to print the last k nodes
// of linked list in reverse order
import java.util.*;
class GFG
{
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Stack to store data value of nodes.
    Stack st = new Stack();
 
    // Push data value of nodes to stack
    while (head != null)
    {
        st.push(head.data);
        head = head.next;
    }
 
    int cnt = 0;
 
    // Pop first k elements of stack and
    // print them.
    while (cnt < k)
    {
        System.out.print(st.peek() + " ");
        st.pop();
        cnt++;
    }
}
 
// Driver code
public static void main(String[] args)
{
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by PrinciRaj1992


Python3
# Python3 implementation to print the last k nodes
# of linked list in reverse order
import sys
import math
 
# Structure of a node
class Node:
    def __init__(self,data):
        self.data = data
        self.next = None
         
# Function to get a new node
def getNode(data):
     
    # allocate space and return new node
    return Node(data)
 
# Function to print the last k nodes
# of linked list in reverse order
def printLastKRev(head,k):
 
    # if list is empty
    if not head:
        return
     
    # Stack to store data value of nodes.
    stack = []
     
    # Push data value of nodes to stack
    while(head):
        stack.append(head.data)
        head = head.next
    cnt = 0
 
    # Pop first k elements of stack and
    # print them.
    while(cnt < k):
        print("{} ".format(stack[-1]),end="")
        stack.pop()
        cnt += 1
         
# Driver code
if __name__=='__main__':
 
    # Create list: 1->2->3->4->5
    head = getNode(1)
    head.next = getNode(2)
    head.next.next = getNode(3)
    head.next.next.next = getNode(4)
    head.next.next.next.next = getNode(5)
 
    k = 4
     
    # print the last k nodes
    printLastKRev(head,k)
 
# This Code is Contributed by Vikash Kumar 37


C#
// C# implementation to print the last k nodes
// of linked list in reverse order
using System;
using System.Collections.Generic;
 
class GFG
{
 
// Structure of a node
public 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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Stack to store data value of nodes.
    Stack st = new Stack();
 
    // Push data value of nodes to stack
    while (head != null)
    {
        st.Push(head.data);
        head = head.next;
    }
 
    int cnt = 0;
 
    // Pop first k elements of stack and
    // print them.
    while (cnt < k)
    {
        Console.Write(st.Peek() + " ");
        st.Pop();
        cnt++;
    }
}
 
// Driver code
public static void Main(String[] args)
{
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code contributed by Rajput-Ji


Javascript


C++
// C++ implementation to print the last k nodes
// of linked list in reverse order
 
#include 
using namespace std;
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
void printLastKRev(Node* head, int k)
{
    // if list is empty
    if (!head)
        return;
 
    // Stack to store data value of nodes.
    stack st;
 
    // Declare two pointers.
    Node *first = head, *sec = head;
 
    int cnt = 0;
 
    // Move second pointer to kth node.
    while (cnt < k) {
        sec = sec->next;
        cnt++;
    }
 
    // Move first pointer to kth node from end
    while (sec) {
        first = first->next;
        sec = sec->next;
    }
 
    // Push last k nodes in stack
    while (first) {
        st.push(first->data);
        first = first->next;
    }
 
    // Last k nodes are reversed when pushed
    // in stack. Pop all k elements of stack
    // and print them.
    while (!st.empty()) {
        cout << st.top() << " ";
        st.pop();
    }
}
 
// Driver code
int main()
{
    // Create list: 1->2->3->4->5
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
 
    return 0;
}


Java
// Java implementation to print
// the last k nodes of linked list
// in reverse order
import java.util.*;
class GFG
{
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Stack to store data value of nodes.
    Stack st = new Stack();
 
    // Declare two pointers.
    Node first = head, sec = head;
 
    int cnt = 0;
 
    // Move second pointer to kth node.
    while (cnt < k)
    {
        sec = sec.next;
        cnt++;
    }
 
    // Move first pointer to kth node from end
    while (sec != null)
    {
        first = first.next;
        sec = sec.next;
    }
 
    // Push last k nodes in stack
    while (first != null)
    {
        st.push(first.data);
        first = first.next;
    }
 
    // Last k nodes are reversed when pushed
    // in stack. Pop all k elements of stack
    // and print them.
    while (!st.empty())
    {
        System.out.print(st.peek() + " ");
        st.pop();
    }
}
 
// Driver code
public static void main(String[] args)
{
     
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by Princi Singh


Python3
# Python3 implementation to print the last k nodes
# of linked list in reverse order
 
# Node class
class Node:
     
    # Function to initialise the node object
    def __init__(self, data):
        self.data = data # Assign data
        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
 
# Function to print the last k nodes
# of linked list in reverse order
def printLastKRev( head, k):
 
    # if list is empty
    if (head == None):
        return
 
    # Stack to store data value of nodes.
    st = []
 
    # Declare two pointers.
    first = head
    sec = head
 
    cnt = 0
 
    # Move second pointer to kth node.
    while (cnt < k) :
        sec = sec.next
        cnt = cnt + 1
     
    # Move first pointer to kth node from end
    while (sec != None):
        first = first.next
        sec = sec.next
     
    # Push last k nodes in stack
    while (first != None):
        st.append(first.data)
        first = first.next
     
    # Last k nodes are reversed when pushed
    # in stack. Pop all k elements of stack
    # and print them.
    while (len(st)):
        print( st[-1], end= " ")
        st.pop()
 
# Driver code
 
# Create list: 1.2.3.4.5
head = getNode(1)
head.next = getNode(2)
head.next.next = getNode(3)
head.next.next.next = getNode(4)
head.next.next.next.next = getNode(5)
 
k = 4
 
# print the last k nodes
printLastKRev(head, k)
 
# This code is contributed by Arnab Kundu


C#
// C# implementation to print
// the last k nodes of linked list
// in reverse order
using System;
using System.Collections.Generic;
     
class GFG
{
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Stack to store data value of nodes.
    Stack st = new Stack();
 
    // Declare two pointers.
    Node first = head, sec = head;
 
    int cnt = 0;
 
    // Move second pointer to kth node.
    while (cnt < k)
    {
        sec = sec.next;
        cnt++;
    }
 
    // Move first pointer to kth node from end
    while (sec != null)
    {
        first = first.next;
        sec = sec.next;
    }
 
    // Push last k nodes in stack
    while (first != null)
    {
        st.Push(first.data);
        first = first.next;
    }
 
    // Last k nodes are reversed when pushed
    // in stack. Pop all k elements of stack
    // and print them.
    while (st.Count != 0)
    {
        Console.Write(st.Peek() + " ");
        st.Pop();
    }
}
 
// Driver code
public static void Main(String[] args)
{
     
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by 29AjayKumar


Javascript


C++
#include 
using namespace std;
   
// Structure of a node
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;
}
   
// Function to print the last k nodes
// of linked list in reverse order
void printLastKRev(Node* head,
                     int& count, int k) {
    struct Node* cur = head;
     
    while(cur != NULL){
        count++;
        cur = cur->next;
    }
         
    int arr[count], temp = count;
    cur = head;
         
    while(cur != NULL){
        arr[--temp] = cur->data;
        cur = cur->next;
    }
     
    for(int i = 0; i < k; i++)
        cout << arr[i] << " ";
}
  //
// Driver code
int main()
{
    // Create list: 1->2->3->4->5
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = getNode(5);
    head->next->next->next->next->next = getNode(10);
   
    int k = 4, count = 0;
   
    // print the last k nodes
    printLastKRev(head, count, k);
   
    return 0;
}


Java
// Java code implementation for above approach
class GFG
{
     
// Structure of a node
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;
}
     
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head,
                          int count, int k)
{
    Node cur = head;
     
    while(cur != null)
    {
        count++;
        cur = cur.next;
    }
         
    int []arr = new int[count];
    int temp = count;
    cur = head;
         
    while(cur != null)
    {
        arr[--temp] = cur.data;
        cur = cur.next;
    }
     
    for(int i = 0; i < k; i++)
        System.out.print(arr[i] + " ");
}
 
// Driver code
public static void main(String[] args)
{
    // Create list: 1.2.3.4.5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
    head.next.next.next.next.next = getNode(10);
     
    int k = 4, count = 0;
     
    // print the last k nodes
    printLastKRev(head, count, k);
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Python3 code implementation for above approach
 
# Structure of a node
class Node:
     
    def __init__(self, data):
         
        self.data = data
        self.next = None
     
# Function to get a new node
def getNode(data):
   
    # allocate space
    newNode = Node(data)
    return newNode
    
# Function to print the last k nodes
# of linked list in reverse order
def printLastKRev(head, count,k):
     
    cur = head;
     
    while(cur != None):
        count += 1
        cur = cur.next;
         
    arr = [0 for i in range(count)]
    temp = count;
    cur = head;
         
    while(cur != None):
        temp -= 1
        arr[temp] = cur.data;
        cur = cur.next;
     
    for i in range(k):
        print(arr[i], end = ' ')
      
# Driver code
if __name__=='__main__':
     
    # Create list: 1.2.3.4.5
    head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
    head.next.next.next.next.next = getNode(10);
   
    k = 4
    count = 0;
   
    # print the last k nodes
    printLastKRev(head, count, k);
   
# This code is contributed by rutvik_56


C#
// C# code implementation for above approach
using System;
class GFG
{
     
// Structure of a node
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;
}
     
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head,
                          int count, int k)
{
    Node cur = head;
     
    while(cur != null)
    {
        count++;
        cur = cur.next;
    }
         
    int []arr = new int[count];
    int temp = count;
    cur = head;
         
    while(cur != null)
    {
        arr[--temp] = cur.data;
        cur = cur.next;
    }
     
    for(int i = 0; i < k; i++)
        Console.Write(arr[i] + " ");
}
 
// Driver code
public static void Main(String[] args)
{
    // Create list: 1.2.3.4.5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
    head.next.next.next.next.next = getNode(10);
     
    int k = 4, count = 0;
     
    // print the last k nodes
    printLastKRev(head, count, k);
}
}
 
// This code is contributed by PrinciRaj1992


Javascript


C++
// C++ implementation to print the last k nodes
// of linked list in reverse order
#include 
using namespace std;
 
// Structure of a node
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;
}
 
// Function to reverse the linked list.
Node* reverseLL(Node* head)
{
    if (!head || !head->next)
        return head;
 
    Node *prev = NULL, *next = NULL, *curr = head;
 
    while (curr) {
        next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }
 
    return prev;
}
 
// Function to print the last k nodes
// of linked list in reverse order
void printLastKRev(Node* head, int k)
{
    // if list is empty
    if (!head)
        return;
 
    // Reverse linked list.
    head = reverseLL(head);
 
    Node* curr = head;
 
    int cnt = 0;
 
    // Print first k nodes of linked list.
    while (cnt < k) {
        cout << curr->data << " ";
        cnt++;
        curr = curr->next;
    }
 
    // Restore the list.
    head = reverseLL(head);
}
 
// Driver code
int main()
{
    // Create list: 1->2->3->4->5
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
 
    return 0;
}


Java
// Java implementation to print the last k nodes
// of linked list in reverse order
import java.util.*;
class GFG
{
 
// Structure of a node
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;
}
 
// Function to reverse the linked list.
static Node reverseLL(Node head)
{
    if (head == null || head.next == null)
        return head;
 
    Node prev = null, next = null, curr = head;
 
    while (curr != null)
    {
        next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Reverse linked list.
    head = reverseLL(head);
 
    Node curr = head;
 
    int cnt = 0;
 
    // Print first k nodes of linked list.
    while (cnt < k)
    {
        System.out.print(curr.data + " ");
        cnt++;
        curr = curr.next;
    }
 
    // Restore the list.
    head = reverseLL(head);
}
 
// Driver code
public static void main(String[] args)
{
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Python3 implementation to print the
# last k nodes of linked list in
# reverse order
 
# Structure of a node
class Node:
     
    def __init__(self, data):
         
        self.data = data
        self.next = None
         
# Function to get a new node
def getNode(data):
     
    # Allocate space
    newNode = Node(data)
    return newNode
 
# Function to reverse the linked list.
def reverseLL(head):
     
    if (not head or not head.next):
        return head
 
    prev = None
    next = None
    curr = head;
     
    while (curr):
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
         
    return prev
     
# Function to print the last k nodes
# of linked list in reverse order
def printLastKRev(head, k):
 
    # If list is empty
    if (not head):
        return
 
    # Reverse linked list.
    head = reverseLL(head)
 
    curr = head
 
    cnt = 0
 
    # Print first k nodes of linked list.
    while (cnt < k):
         
        print(curr.data, end = ' ')
        cnt += 1
        curr = curr.next
 
    # Restore the list.
    head = reverseLL(head)
 
# Driver code
if __name__=='__main__':
     
    # Create list: 1.2.3.4.5
    head = getNode(1)
    head.next = getNode(2)
    head.next.next = getNode(3)
    head.next.next.next = getNode(4)
    head.next.next.next.next = getNode(5)
 
    k = 4
 
    # Print the last k nodes
    printLastKRev(head, k)
 
# This code is contributed by pratham76


C#
// C# implementation to print the last k nodes
// of linked list in reverse order
using System;
 
class GFG
{
 
// Structure of a node
public 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;
}
 
// Function to reverse the linked list.
static Node reverseLL(Node head)
{
    if (head == null || head.next == null)
        return head;
 
    Node prev = null, next = null, curr = head;
 
    while (curr != null)
    {
        next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Reverse linked list.
    head = reverseLL(head);
 
    Node curr = head;
 
    int cnt = 0;
 
    // Print first k nodes of linked list.
    while (cnt < k)
    {
        Console.Write(curr.data + " ");
        cnt++;
        curr = curr.next;
    }
 
    // Restore the list.
    head = reverseLL(head);
}
 
// Driver code
public static void Main(String[] args)
{
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by Princi Singh


Javascript


输出:
5 4 3 2

时间复杂度: O(N)
辅助空间: O(N)

上述方法的辅助空间可以减少到 O(k) 。这个想法是使用两个指针。将第一个指针放在列表的开头,并将第二个指针移动到第 k 个节点的开头。然后使用本文讨论的方法从末尾查找第 k 个节点:Find kth node from end oflinked list。从末尾找到第 k 个节点后,推送堆栈中的所有剩余节点。从堆栈中一个一个地弹出所有元素并打印它们。

下面是上述高效方法的实现:

C++

// C++ implementation to print the last k nodes
// of linked list in reverse order
 
#include 
using namespace std;
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
void printLastKRev(Node* head, int k)
{
    // if list is empty
    if (!head)
        return;
 
    // Stack to store data value of nodes.
    stack st;
 
    // Declare two pointers.
    Node *first = head, *sec = head;
 
    int cnt = 0;
 
    // Move second pointer to kth node.
    while (cnt < k) {
        sec = sec->next;
        cnt++;
    }
 
    // Move first pointer to kth node from end
    while (sec) {
        first = first->next;
        sec = sec->next;
    }
 
    // Push last k nodes in stack
    while (first) {
        st.push(first->data);
        first = first->next;
    }
 
    // Last k nodes are reversed when pushed
    // in stack. Pop all k elements of stack
    // and print them.
    while (!st.empty()) {
        cout << st.top() << " ";
        st.pop();
    }
}
 
// Driver code
int main()
{
    // Create list: 1->2->3->4->5
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
 
    return 0;
}

Java

// Java implementation to print
// the last k nodes of linked list
// in reverse order
import java.util.*;
class GFG
{
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Stack to store data value of nodes.
    Stack st = new Stack();
 
    // Declare two pointers.
    Node first = head, sec = head;
 
    int cnt = 0;
 
    // Move second pointer to kth node.
    while (cnt < k)
    {
        sec = sec.next;
        cnt++;
    }
 
    // Move first pointer to kth node from end
    while (sec != null)
    {
        first = first.next;
        sec = sec.next;
    }
 
    // Push last k nodes in stack
    while (first != null)
    {
        st.push(first.data);
        first = first.next;
    }
 
    // Last k nodes are reversed when pushed
    // in stack. Pop all k elements of stack
    // and print them.
    while (!st.empty())
    {
        System.out.print(st.peek() + " ");
        st.pop();
    }
}
 
// Driver code
public static void main(String[] args)
{
     
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by Princi Singh

Python3

# Python3 implementation to print the last k nodes
# of linked list in reverse order
 
# Node class
class Node:
     
    # Function to initialise the node object
    def __init__(self, data):
        self.data = data # Assign data
        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
 
# Function to print the last k nodes
# of linked list in reverse order
def printLastKRev( head, k):
 
    # if list is empty
    if (head == None):
        return
 
    # Stack to store data value of nodes.
    st = []
 
    # Declare two pointers.
    first = head
    sec = head
 
    cnt = 0
 
    # Move second pointer to kth node.
    while (cnt < k) :
        sec = sec.next
        cnt = cnt + 1
     
    # Move first pointer to kth node from end
    while (sec != None):
        first = first.next
        sec = sec.next
     
    # Push last k nodes in stack
    while (first != None):
        st.append(first.data)
        first = first.next
     
    # Last k nodes are reversed when pushed
    # in stack. Pop all k elements of stack
    # and print them.
    while (len(st)):
        print( st[-1], end= " ")
        st.pop()
 
# Driver code
 
# Create list: 1.2.3.4.5
head = getNode(1)
head.next = getNode(2)
head.next.next = getNode(3)
head.next.next.next = getNode(4)
head.next.next.next.next = getNode(5)
 
k = 4
 
# print the last k nodes
printLastKRev(head, k)
 
# This code is contributed by Arnab Kundu

C#

// C# implementation to print
// the last k nodes of linked list
// in reverse order
using System;
using System.Collections.Generic;
     
class GFG
{
 
// Structure of a node
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;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Stack to store data value of nodes.
    Stack st = new Stack();
 
    // Declare two pointers.
    Node first = head, sec = head;
 
    int cnt = 0;
 
    // Move second pointer to kth node.
    while (cnt < k)
    {
        sec = sec.next;
        cnt++;
    }
 
    // Move first pointer to kth node from end
    while (sec != null)
    {
        first = first.next;
        sec = sec.next;
    }
 
    // Push last k nodes in stack
    while (first != null)
    {
        st.Push(first.data);
        first = first.next;
    }
 
    // Last k nodes are reversed when pushed
    // in stack. Pop all k elements of stack
    // and print them.
    while (st.Count != 0)
    {
        Console.Write(st.Peek() + " ");
        st.Pop();
    }
}
 
// Driver code
public static void Main(String[] args)
{
     
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by 29AjayKumar

Javascript


输出:
5 4 3 2

时间复杂度: O(N)
辅助空间: O(k)

方法2:

  • 计算链表中的节点数。
  • 声明一个以节点数为大小的数组。
  • 从数组的末尾开始存储链表的节点的值,即相反的方式。
  • 从数组的开头打印 k 个值。

C++

#include 
using namespace std;
   
// Structure of a node
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;
}
   
// Function to print the last k nodes
// of linked list in reverse order
void printLastKRev(Node* head,
                     int& count, int k) {
    struct Node* cur = head;
     
    while(cur != NULL){
        count++;
        cur = cur->next;
    }
         
    int arr[count], temp = count;
    cur = head;
         
    while(cur != NULL){
        arr[--temp] = cur->data;
        cur = cur->next;
    }
     
    for(int i = 0; i < k; i++)
        cout << arr[i] << " ";
}
  //
// Driver code
int main()
{
    // Create list: 1->2->3->4->5
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = getNode(5);
    head->next->next->next->next->next = getNode(10);
   
    int k = 4, count = 0;
   
    // print the last k nodes
    printLastKRev(head, count, k);
   
    return 0;
}

Java

// Java code implementation for above approach
class GFG
{
     
// Structure of a node
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;
}
     
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head,
                          int count, int k)
{
    Node cur = head;
     
    while(cur != null)
    {
        count++;
        cur = cur.next;
    }
         
    int []arr = new int[count];
    int temp = count;
    cur = head;
         
    while(cur != null)
    {
        arr[--temp] = cur.data;
        cur = cur.next;
    }
     
    for(int i = 0; i < k; i++)
        System.out.print(arr[i] + " ");
}
 
// Driver code
public static void main(String[] args)
{
    // Create list: 1.2.3.4.5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
    head.next.next.next.next.next = getNode(10);
     
    int k = 4, count = 0;
     
    // print the last k nodes
    printLastKRev(head, count, k);
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 code implementation for above approach
 
# Structure of a node
class Node:
     
    def __init__(self, data):
         
        self.data = data
        self.next = None
     
# Function to get a new node
def getNode(data):
   
    # allocate space
    newNode = Node(data)
    return newNode
    
# Function to print the last k nodes
# of linked list in reverse order
def printLastKRev(head, count,k):
     
    cur = head;
     
    while(cur != None):
        count += 1
        cur = cur.next;
         
    arr = [0 for i in range(count)]
    temp = count;
    cur = head;
         
    while(cur != None):
        temp -= 1
        arr[temp] = cur.data;
        cur = cur.next;
     
    for i in range(k):
        print(arr[i], end = ' ')
      
# Driver code
if __name__=='__main__':
     
    # Create list: 1.2.3.4.5
    head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
    head.next.next.next.next.next = getNode(10);
   
    k = 4
    count = 0;
   
    # print the last k nodes
    printLastKRev(head, count, k);
   
# This code is contributed by rutvik_56

C#

// C# code implementation for above approach
using System;
class GFG
{
     
// Structure of a node
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;
}
     
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head,
                          int count, int k)
{
    Node cur = head;
     
    while(cur != null)
    {
        count++;
        cur = cur.next;
    }
         
    int []arr = new int[count];
    int temp = count;
    cur = head;
         
    while(cur != null)
    {
        arr[--temp] = cur.data;
        cur = cur.next;
    }
     
    for(int i = 0; i < k; i++)
        Console.Write(arr[i] + " ");
}
 
// Driver code
public static void Main(String[] args)
{
    // Create list: 1.2.3.4.5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
    head.next.next.next.next.next = getNode(10);
     
    int k = 4, count = 0;
     
    // print the last k nodes
    printLastKRev(head, count, k);
}
}
 
// This code is contributed by PrinciRaj1992

Javascript


输出:
10 5 4 3

时间复杂度: O(N)
辅助空间: O(N)

方法 3:想法是首先迭代地反转链表,如下面的帖子所述:反转链表。反转后打印反转列表的前 k 个节点。打印后通过再次反转列表来恢复列表。

以下是上述方法的实现:

C++

// C++ implementation to print the last k nodes
// of linked list in reverse order
#include 
using namespace std;
 
// Structure of a node
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;
}
 
// Function to reverse the linked list.
Node* reverseLL(Node* head)
{
    if (!head || !head->next)
        return head;
 
    Node *prev = NULL, *next = NULL, *curr = head;
 
    while (curr) {
        next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }
 
    return prev;
}
 
// Function to print the last k nodes
// of linked list in reverse order
void printLastKRev(Node* head, int k)
{
    // if list is empty
    if (!head)
        return;
 
    // Reverse linked list.
    head = reverseLL(head);
 
    Node* curr = head;
 
    int cnt = 0;
 
    // Print first k nodes of linked list.
    while (cnt < k) {
        cout << curr->data << " ";
        cnt++;
        curr = curr->next;
    }
 
    // Restore the list.
    head = reverseLL(head);
}
 
// Driver code
int main()
{
    // Create list: 1->2->3->4->5
    Node* head = getNode(1);
    head->next = getNode(2);
    head->next->next = getNode(3);
    head->next->next->next = getNode(4);
    head->next->next->next->next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
 
    return 0;
}

Java

// Java implementation to print the last k nodes
// of linked list in reverse order
import java.util.*;
class GFG
{
 
// Structure of a node
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;
}
 
// Function to reverse the linked list.
static Node reverseLL(Node head)
{
    if (head == null || head.next == null)
        return head;
 
    Node prev = null, next = null, curr = head;
 
    while (curr != null)
    {
        next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Reverse linked list.
    head = reverseLL(head);
 
    Node curr = head;
 
    int cnt = 0;
 
    // Print first k nodes of linked list.
    while (cnt < k)
    {
        System.out.print(curr.data + " ");
        cnt++;
        curr = curr.next;
    }
 
    // Restore the list.
    head = reverseLL(head);
}
 
// Driver code
public static void main(String[] args)
{
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 implementation to print the
# last k nodes of linked list in
# reverse order
 
# Structure of a node
class Node:
     
    def __init__(self, data):
         
        self.data = data
        self.next = None
         
# Function to get a new node
def getNode(data):
     
    # Allocate space
    newNode = Node(data)
    return newNode
 
# Function to reverse the linked list.
def reverseLL(head):
     
    if (not head or not head.next):
        return head
 
    prev = None
    next = None
    curr = head;
     
    while (curr):
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
         
    return prev
     
# Function to print the last k nodes
# of linked list in reverse order
def printLastKRev(head, k):
 
    # If list is empty
    if (not head):
        return
 
    # Reverse linked list.
    head = reverseLL(head)
 
    curr = head
 
    cnt = 0
 
    # Print first k nodes of linked list.
    while (cnt < k):
         
        print(curr.data, end = ' ')
        cnt += 1
        curr = curr.next
 
    # Restore the list.
    head = reverseLL(head)
 
# Driver code
if __name__=='__main__':
     
    # Create list: 1.2.3.4.5
    head = getNode(1)
    head.next = getNode(2)
    head.next.next = getNode(3)
    head.next.next.next = getNode(4)
    head.next.next.next.next = getNode(5)
 
    k = 4
 
    # Print the last k nodes
    printLastKRev(head, k)
 
# This code is contributed by pratham76

C#

// C# implementation to print the last k nodes
// of linked list in reverse order
using System;
 
class GFG
{
 
// Structure of a node
public 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;
}
 
// Function to reverse the linked list.
static Node reverseLL(Node head)
{
    if (head == null || head.next == null)
        return head;
 
    Node prev = null, next = null, curr = head;
 
    while (curr != null)
    {
        next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}
 
// Function to print the last k nodes
// of linked list in reverse order
static void printLastKRev(Node head, int k)
{
    // if list is empty
    if (head == null)
        return;
 
    // Reverse linked list.
    head = reverseLL(head);
 
    Node curr = head;
 
    int cnt = 0;
 
    // Print first k nodes of linked list.
    while (cnt < k)
    {
        Console.Write(curr.data + " ");
        cnt++;
        curr = curr.next;
    }
 
    // Restore the list.
    head = reverseLL(head);
}
 
// Driver code
public static void Main(String[] args)
{
    // Create list: 1->2->3->4->5
    Node head = getNode(1);
    head.next = getNode(2);
    head.next.next = getNode(3);
    head.next.next.next = getNode(4);
    head.next.next.next.next = getNode(5);
 
    int k = 4;
 
    // print the last k nodes
    printLastKRev(head, k);
}
}
 
// This code is contributed by Princi Singh

Javascript


输出:
5 4 3 2

时间复杂度: O(N)
辅助空间: O(1)