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 表示当前节点的前驱节点,初始值为 null;curr 表示当前节点,初始值为 head;nextTemp 是为了暂时保存当前节点 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 表示当前节点,递归终止的条件为 head 为 null 或者 head.next 为 null,即链表为空或者只有一个节点;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 表示一个新的头节点,为栈中最后一个节点,将其取出并记为 newHead;curr 表示当前节点,用来遍历栈中剩余的节点,依次将其和之前的节点连接起来,构成新的链表。最后需要将新链表的尾节点的后继节点指向 null。
总结
以上就是本文介绍的三种实现反转链表的方法。迭代方法和使用栈实现方法比较直接,容易理解和实现;递归方法则略微复杂,但能够有效缩短代码的长度。根据自己的需求和习惯,可以根据这些方法进行选择和实现。
