返回
JavaScript刷leetcode第206题-反转链表(迭代法 + 递归法)
前端
2023-12-04 04:49:03
链表概述
链表是一种常见的数据结构,通常用于存储和操作顺序数据。链表由一系列节点组成,每个节点包含一个值和指向下一个节点的指针。链表中的节点可以动态添加或删除,因此它非常适合处理不断变化的数据。
反转链表
反转链表是指将链表中节点的顺序颠倒。例如,对于链表1->2->3->4->5,反转后变成5->4->3->2->1。反转链表在某些算法和数据结构中非常有用,例如栈和队列。
解法一:迭代法
迭代法是一种常见的反转链表方法,它通过逐个遍历链表中的节点来实现。在迭代过程中,我们不断改变节点的指针指向,直到整个链表反转完成。
// 定义链表节点类
class ListNode {
constructor(val, next) {
this.val = val === undefined ? 0 : val;
this.next = next === undefined ? null : next;
}
}
// 定义反转链表函数
function reverseListIterative(head) {
let prev = null;
let current = head;
while (current) {
// 保存当前节点的下一个节点
const nextNode = current.next;
// 将当前节点的下一个节点指向反转后的链表
current.next = prev;
// 将当前节点更新为反转后的链表的头部
prev = current;
// 将当前节点更新为下一个节点
current = nextNode;
}
return prev;
}
解法二:递归法
递归法是一种通过不断调用自身来解决问题的编程技巧。在反转链表问题中,我们可以使用递归法来逐个反转链表中的节点。
// 定义反转链表函数
function reverseListRecursive(head) {
// 如果链表为空或只有一个节点,则直接返回
if (!head || !head.next) {
return head;
}
// 反转链表的其余部分
const newHead = reverseListRecursive(head.next);
// 将当前节点的下一个节点指向反转后的链表
head.next.next = head;
// 将当前节点的下一个节点指向null
head.next = null;
// 返回反转后的链表的头部
return newHead;
}
比较
迭代法和递归法都是反转链表的常用方法。迭代法的实现相对简单,而递归法的实现更具数学美感。在实践中,您需要根据具体情况选择合适的方法。
结语
通过本文,您已经掌握了反转链表的两种解法:迭代法和递归法。这些方法不仅可以帮助您解决LeetCode第206题,还能加深您对链表操作的理解。