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

📅  最后修改于: 2023-12-03 15:22:23.347000             🧑  作者: Mango

使用堆栈反转链表的程序

在编程中,经常需要反转一个链表。使用堆栈是一种容易理解和实现的方法。在这篇文章中,我们将介绍如何使用堆栈来反转一个链表。

什么是堆栈?

堆栈是一种数据结构,它具有后进先出(LIFO)的特性。这意味着最后进入堆栈的元素最先被取出。在Java中,我们可以使用Stack类来实现堆栈。

反转链表的思路

反转链表的一种常见思路是使用递归。但是,递归需要使用系统栈,如果链表非常长则可能导致栈溢出。因此,我们可以使用堆栈来消除递归。

我们可以遍历链表并将每个节点放入堆栈中,然后从堆栈中弹出每个节点,并重新链接到新的链表中。由于堆栈具有后进先出的特性,我们可以确保最后一个节点成为新链表的头节点,第一个节点成为新链表的尾节点。

反转链表的代码实现

下面是使用堆栈反转链表的Java代码:

public ListNode reverseList(ListNode head) {
    Stack<ListNode> stack = new Stack<>();
    ListNode curr = head;
    while (curr != null) {
        stack.push(curr);
        curr = curr.next;
    }
    ListNode newHead = stack.pop();
    curr = newHead;
    while (!stack.isEmpty()) {
        ListNode node = stack.pop();
        curr.next = node;
        curr = node;
    }
    curr.next = null;
    return newHead;
}
代码解释

我们首先创建一个堆栈,然后遍历链表并将每个节点放入堆栈中。接下来,我们从堆栈中弹出每个节点,并将其链接到新链表的尾部,直到堆栈为空。

由于最后一个节点被最先放入堆栈中,所以我们可以使用pop()方法来获得新链表的头节点。我们还需要在新链表的尾部设置NULL,以确保新链表的末尾正确。

总结

使用堆栈来反转链表是一种很好的方法。它比递归更容易理解,并且没有栈溢出的风险。这篇文章介绍了如何使用堆栈反转链表,并提供了Java代码示例。