📜  使用堆栈反转链表的程序

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

使用堆栈反转链表的程序

给定一个链表。任务是使用辅助堆栈反转链表元素的顺序。
例子:

Input : List = 3 -> 2 -> 1
Output : 1 -> 2 -> 3

Input : 9 -> 7 -> 4 -> 2
Output : 2 -> 4 -> 7 -> 9 

算法

  1. 遍历列表并将其所有节点压入堆栈。
  2. 再次从头节点遍历列表,从栈顶弹出一个值,并以相反的顺序连接它们。

下面是上述方法的实现:

C++
// C/C++ program to reverse linked list
// using stack
 
#include 
using namespace std;
 
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* Given a reference (pointer to pointer) to
   the head of a list and an int, push a new
   node on the front of the list. */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node = new Node;
 
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
 
// Function to reverse linked list
Node *reverseList(Node* head)
{
    // Stack to store elements of list
    stack stk;
 
    // Push the elements of list to stack
    Node* ptr = head;
    while (ptr->next != NULL) {
        stk.push(ptr);
        ptr = ptr->next;
    }
 
    // Pop from stack and replace
    // current nodes value'
    head = ptr;
    while (!stk.empty()) {
        ptr->next = stk.top();
 
        ptr = ptr->next;
        stk.pop();
    }
     
    ptr->next = NULL;
     
    return head;
}
 
// Function to print the Linked list
void printList(Node* head)
{
    while (head) {
        cout << head->data << " ";
        head = head->next;
    }
}
 
// Driver Code
int main()
{
    /* Start with the empty list */
    struct Node* head = NULL;
 
    /* Use push() to construct below list
    1->2->3->4->5 */
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
 
    head = reverseList(head);
 
    printList(head);
 
    return 0;
}


Java
// Java program to reverse linked list
// using stack
import java.util.*;
class GfG
{
 
/* Link list node */
static class Node
{
    int data;
    Node next;
}
static Node head = null;
 
/* Given a reference (pointer to pointer) to
the head of a list and an int, push a new
node on the front of the list. */
static void push( int new_data)
{
    Node new_node = new Node();
 
    new_node.data = new_data;
    new_node.next = (head);
    (head) = new_node;
}
 
// Function to reverse linked list
static Node reverseList(Node head)
{
    // Stack to store elements of list
    Stack stk = new Stack ();
 
    // Push the elements of list to stack
    Node ptr = head;
    while (ptr.next != null)
    {
        stk.push(ptr);
        ptr = ptr.next;
    }
 
    // Pop from stack and replace
    // current nodes value'
    head = ptr;
    while (!stk.isEmpty())
    {
        ptr.next = stk.peek();
        ptr = ptr.next;
        stk.pop();
    }
    ptr.next = null;
     
    return head;
}
 
// Function to print the Linked list
static void printList(Node head)
{
    while (head != null)
    {
        System.out.print(head.data + " ");
        head = head.next;
    }
}
 
// Driver Code
public static void main(String[] args)
{
    /* Start with the empty list */
    //Node head = null;
 
    /* Use push() to construct below list
    1->2->3->4->5 */
    push( 5);
    push( 4);
    push( 3);
    push( 2);
    push( 1);
 
    head = reverseList(head);
 
    printList(head);
}
}
 
// This code is contributed by Prerna Saini.


Python3
# Python3 program to reverse a linked
# list using stack
 
# Link list node
class Node:
     
    def __init__(self, data, next):
        self.data = data
        self.next = next
 
class LinkedList:
     
    def __init__(self):
        self.head = None
         
    # Function to push a new Node in
    # the linked list
    def push(self, new_data):
     
        new_node = Node(new_data, self.head)
        self.head = new_node
     
    # Function to reverse linked list
    def reverseList(self):
     
        # Stack to store elements of list
        stk = []
     
        # Push the elements of list to stack
        ptr = self.head
        while ptr.next != None:
            stk.append(ptr)
            ptr = ptr.next
     
        # Pop from stack and replace
        # current nodes value'
        self.head = ptr
        while len(stk) != 0:
            ptr.next = stk.pop()
            ptr = ptr.next
         
        ptr.next = None
     
    # Function to print the Linked list
    def printList(self):
         
        curr = self.head
        while curr:
            print(curr.data, end = " ")
            curr = curr.next
 
# Driver Code
if __name__ == "__main__":
 
    # Start with the empty list
    linkedList = LinkedList()
 
    # Use push() to construct below list
    # 1.2.3.4.5
    linkedList.push(5)
    linkedList.push(4)
    linkedList.push(3)
    linkedList.push(2)
    linkedList.push(1)
 
    linkedList.reverseList()
 
    linkedList.printList()
 
# This code is contributed by Rituraj Jain


C#
// C# program to reverse linked list
// using stack
using System;
using System.Collections.Generic;
 
class GfG
{
 
/* Link list node */
public class Node
{
    public int data;
    public Node next;
}
static Node head = null;
 
/* Given a reference (pointer to pointer) to
the head of a list and an int, push a new
node on the front of the list. */
static void push( int new_data)
{
    Node new_node = new Node();
 
    new_node.data = new_data;
    new_node.next = (head);
    (head) = new_node;
}
 
// Function to reverse linked list
static Node reverseList(Node head)
{
    // Stack to store elements of list
    Stack stk = new Stack ();
 
    // Push the elements of list to stack
    Node ptr = head;
    while (ptr.next != null)
    {
        stk.Push(ptr);
        ptr = ptr.next;
    }
 
    // Pop from stack and replace
    // current nodes value'
    head = ptr;
    while (stk.Count != 0)
    {
        ptr.next = stk.Peek();
        ptr = ptr.next;
        stk.Pop();
    }
    ptr.next = null;
     
    return head;
}
 
// Function to print the Linked list
static void printList(Node head)
{
    while (head != null)
    {
        Console.Write(head.data + " ");
        head = head.next;
    }
}
 
// Driver Code
public static void Main(String[] args)
{
    /* Start with the empty list */
    //Node head = null;
 
    /* Use push() to construct below list
    1->2->3->4->5 */
    push( 5);
    push( 4);
    push( 3);
    push( 2);
    push( 1);
 
    head = reverseList(head);
 
    printList(head);
}
}
 
// This code contributed by Rajput-Ji


Javascript


输出:
5 4 3 2 1

时间复杂度: O(n)
我们可以用 O(1) 辅助空间反转一个链表。查看更多反转链表的方法。