当前位置:首页 > JavaScript

js实现oddevenlist

2026-01-31 20:04:04JavaScript

js实现oddevenlist

实现 Odd Even List 的 JavaScript 方法

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

方法一:使用双指针法

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 的情况。
  • 在递归实现中,注意递归深度可能导致的栈溢出问题。

js实现oddevenlist

标签: jsoddevenlist
分享给朋友:

相关文章

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEv…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…