欢迎访问宙启技术站
智能推送

Java中实现反转链表的三种函数方法分享

发布时间:2023-06-22 20:17:27

反转链表是非常基础和常见的链表操作之一。在 Java 中,我们可以通过三种不同的函数方法来实现反转链表,包括迭代方法、递归方法以及使用栈来实现的方法。本文将分别介绍这三种方法。

1. 迭代方法

迭代方法是一种最简单和最直接的方法,其基本思路是从头开始遍历链表,将每个节点的后继指针指向前一个节点,直到遍历到链表尾节点。代码如下:

public ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode nextTemp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}

其中,prev 表示当前节点的前驱节点,初始值为 nullcurr 表示当前节点,初始值为 headnextTemp 是为了暂时保存当前节点 curr 的下一个节点。

2. 递归方法

递归方法也是一种非常常见的方法,其基本思路是将当前节点的后继节点反转,并将当前节点作为后继节点的后继节点。代码如下:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}

其中,head 表示当前节点,递归终止的条件为 headnull 或者 head.nextnull,即链表为空或者只有一个节点;p 是递归到链表的尾节点,需要将其作为新的头节点返回。

3. 使用栈实现

使用栈实现反转链表的思路是将链表节点依次入栈,然后再依次出栈,出栈的顺序就是反转后的顺序。代码如下:

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

其中,stack 是用来存放链表节点的栈,遍历链表并入栈的过程就是将每个节点入栈;newHead 表示一个新的头节点,为栈中最后一个节点,将其取出并记为 newHeadcurr 表示当前节点,用来遍历栈中剩余的节点,依次将其和之前的节点连接起来,构成新的链表。最后需要将新链表的尾节点的后继节点指向 null

总结

以上就是本文介绍的三种实现反转链表的方法。迭代方法和使用栈实现方法比较直接,容易理解和实现;递归方法则略微复杂,但能够有效缩短代码的长度。根据自己的需求和习惯,可以根据这些方法进行选择和实现。