📅  最后修改于: 2023-12-03 14:56:19.118000             🧑  作者: Mango
在 JavaScript 中,单链表是一种常用的数据结构,它由一系列的节点组成,每个节点包含一个值和指向下一个节点的指针。本文将介绍一个用于交替拆分给定单链表的 JavaScript 程序的实现。
给定一个单链表,要求将其交替拆分为两个新的链表。即将原链表中的奇数位置节点串成一个新链表,偶数位置节点串成另一个新链表。
例如,对于输入链表:1 -> 2 -> 3 -> 4 -> 5,期望输出为两个链表:1 -> 3 -> 5 和 2 -> 4。
我们可以使用两个指针,分别指向奇数位置节点和偶数位置节点。然后遍历原链表,将奇数位置节点连接起来,同时将偶数位置节点连接起来。
以下是一个用于交替拆分给定单链表的 JavaScript 程序的实现:
class ListNode {
constructor(val, next = null) {
this.val = val;
this.next = next;
}
}
const alternateSplit = (head) => {
if (!head || !head.next) {
return [head, null];
}
let oddHead = head;
let evenHead = head.next;
let odd = oddHead;
let even = evenHead;
while (odd.next && even.next) {
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = null;
return [oddHead, evenHead];
};
// 示例输入链表
const head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
// 调用交替拆分函数,并打印结果
const result = alternateSplit(head);
console.log('奇数链表:', result[0]);
console.log('偶数链表:', result[1]);
以上代码定义了一个 ListNode
类表示链表节点,其中 val
表示节点的值,next
表示指向下一个节点的指针。
alternateSplit
函数接受一个链表的头节点作为参数,返回一个数组,其中第一个元素为奇数位置节点构成的链表的头节点,第二个元素为偶数位置节点构成的链表的头节点。
在函数内部,我们首先判断链表的长度是否小于等于 1,如果是,则直接返回原链表作为奇数链表,另一个链表为空。否则,我们使用两个指针 oddHead
和 evenHead
分别指向奇数位置节点和偶数位置节点的头部。然后使用两个指针 odd
和 even
分别指向当前奇数和偶数节点,通过遍历链表,将奇数位置节点连接起来,同时将偶数位置节点连接起来。最后,我们将奇数链表的最后一个节点的 next
指针置为 null
,然后返回结果。
代码执行结果将会打印出拆分后的两个链表:奇数链表和偶数链表。
以上就是一个用于交替拆分给定单链表的 JavaScript 程序的介绍。该程序使用了指针操作和链表遍历的技巧来解决问题,时间复杂度为 O(n),空间复杂度为 O(1)。