当前位置:首页 > JavaScript

js实现oddevenlist

2026-01-31 20:04:04JavaScript

实现 Odd Even List 的 JavaScript 方法

Odd Even List 是一种将链表中的奇数节点和偶数节点分别排列的算法。奇数节点指的是节点位置为奇数的节点,偶数节点指的是节点位置为偶数的节点。以下是实现方法:

js实现oddevenlist

方法一:使用双指针法

function oddEvenList(head) {
    if (head === null) return null;

    let odd = head;
    let even = head.next;
    let evenHead = even;

    while (even !== null && even.next !== null) {
        odd.next = even.next;
        odd = odd.next;
        even.next = odd.next;
        even = even.next;
    }

    odd.next = evenHead;
    return head;
}
  • 初始化 odd 指针指向头节点,even 指针指向头节点的下一个节点。
  • 保存 even 的头节点为 evenHead,以便后续连接。
  • 遍历链表,odd 指针连接下一个奇数节点,even 指针连接下一个偶数节点。
  • 最后将 odd 链表的尾部连接到 even 链表的头部。

方法二:使用数组存储节点

function oddEvenList(head) {
    if (head === null) return null;

    const nodes = [];
    let current = head;

    while (current !== null) {
        nodes.push(current);
        current = current.next;
    }

    const oddNodes = nodes.filter((_, index) => index % 2 === 0);
    const evenNodes = nodes.filter((_, index) => index % 2 !== 0);

    const reordered = [...oddNodes, ...evenNodes];

    for (let i = 0; i < reordered.length - 1; i++) {
        reordered[i].next = reordered[i + 1];
    }

    reordered[reordered.length - 1].next = null;
    return reordered[0];
}
  • 遍历链表,将所有节点存入数组。
  • 使用 filter 方法分离奇数节点和偶数节点。
  • 合并奇数节点和偶数节点数组。
  • 重新连接节点,形成新的链表。

方法三:递归实现

function oddEvenList(head, isOdd = true, oddHead = null, evenHead = null, oddTail = null, evenTail = null) {
    if (head === null) {
        if (oddTail !== null) oddTail.next = evenHead;
        return oddHead;
    }

    if (isOdd) {
        if (oddHead === null) {
            oddHead = head;
            oddTail = head;
        } else {
            oddTail.next = head;
            oddTail = oddTail.next;
        }
    } else {
        if (evenHead === null) {
            evenHead = head;
            evenTail = head;
        } else {
            evenTail.next = head;
            evenTail = evenTail.next;
        }
    }

    return oddEvenList(head.next, !isOdd, oddHead, evenHead, oddTail, evenTail);
}
  • 使用递归遍历链表,根据当前节点的奇偶性将其分配到奇数链表或偶数链表。
  • 递归结束后,将奇数链表的尾部连接到偶数链表的头部。

注意事项

  • 确保链表不为空,否则直接返回 null
  • 在双指针法中,注意边界条件,如链表长度为 1 或 2 的情况。
  • 在递归实现中,注意递归深度可能导致的栈溢出问题。

标签: jsoddevenlist
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…