今天分享的内容非常简单,是拆分一个链表,将链表中次序为奇数的节点放到链表 A 中,次序为偶数的节点放到链表 B 中
我们开始吧
准备数据
javascript
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
const generator = (array) => {
let root = { next: null },
node = root;
array.forEach((item) => {
const temp = new Node(item);
node.next = temp;
node = temp;
});
return root.next;
};
const linkList = generator(data);
上面代码准备了一个含有十个节点的单链表,1 节点作为链表的头节点。
下面将会拆分这个链表,将奇数节点放在链表 A中,偶数次序的节点放在链表 B 中
javascript
const splitLinkList = (linkList) => {
const listA = linkList,
listB = linkList.next;
let node = listB.next,
ra = listA,
rb = listB;
let i = 2;
while (node) {
if (i % 2 == 0) {
ra.next = node;
ra = ra.next;
} else if (i % 2 == 1) {
rb.next = node;
rb = rb.next;
}
node = node.next;
i++;
}
ra.next = null;
rb.next = null;
return { listA, listB };
};
定义了一个函数splitLinkList
,接受一个链表作为参数,并且将两个链表作为返回值。返回的两个链表也是没有空节点作为头节点
代码的开头将 listA
指向linkList
的第一个节点,将listB
指向linkList
的第二个节点,并且用新变量 node
指向linkList
第三个节点,然后 i 也是从 2 开始,待会遍历linkList
也是从第三个节点开始。
另外声明了两个变量 ra,rb,分别表示listA
和listB
的尾节点。
while
中开始遍历,如果 i 是奇数,就将新节点插入listB
中;如果 i 是偶数,就将新节点插入listA
中。直到linkList
遍历完成
在函数的最后需要将 ra
和 rb
的 next 置为 null。对尾节点做专门处理,放置两个链表的尾节点连在一起
最后返回两个新链表
测试代码
javascript
const { listA, listB } = splitLinkList(linkList);
const printLinkList = (linkList) => {
while (linkList) {
console.log(linkList.value);
linkList = linkList.next;
}
};
printLinkList(listA);
// 1
// 3
// 5
// 7
// 9
printLinkList(listB);
// 2
// 4
// 6
// 8
// 10
用了一个函数来顺序输出链表,方便我们观察链表中有哪些数据。
从输出结构中看到,listA
中只有奇数节点,listB
中只有偶数节点。符合预期,代码测试成功
总结
这篇文章分享了链表的拆分,问题很简单,不难。属于指针操作的基本功。在之后的二叉树,图等操作都离不开指针的操作,基础很重要
你觉得这篇文章怎么样?我每天都会分享一篇算法小练习,喜欢就点赞+关注吧