🥳每日一练-拆分链表-JS简易版

今天分享的内容非常简单,是拆分一个链表,将链表中次序为奇数的节点放到链表 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,分别表示listAlistB的尾节点。

while中开始遍历,如果 i 是奇数,就将新节点插入listB中;如果 i 是偶数,就将新节点插入listA中。直到linkList遍历完成

在函数的最后需要将 rarb 的 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 中只有偶数节点。符合预期,代码测试成功

总结

这篇文章分享了链表的拆分,问题很简单,不难。属于指针操作的基本功。在之后的二叉树,图等操作都离不开指针的操作,基础很重要

你觉得这篇文章怎么样?我每天都会分享一篇算法小练习,喜欢就点赞+关注吧

相关推荐
光影少年3 分钟前
React vs Next.js
前端·javascript·react.js
Yupureki4 分钟前
《算法竞赛从入门到国奖》算法基础:入门篇-离散化
c语言·数据结构·c++·算法·visual studio
谢尔登5 分钟前
Vue3 响应式系统——ref 和 reactive
前端·javascript·vue.js
天若有情6735 分钟前
【JavaScript】React 实现 Vue 的 watch 和 computed 详解
javascript·vue.js·react.js
散峰而望6 分钟前
OJ 题目的做题模式和相关报错情况
java·c语言·数据结构·c++·vscode·算法·visual studio code
zc.ovo18 分钟前
线段树优化建图
数据结构·c++·算法·图论
WaWaJie_Ngen19 分钟前
C++实现一笔画游戏
c++·算法·游戏·游戏程序·课程设计
程序员-King.21 分钟前
day140—前后指针—删除排序链表中的重复元素Ⅱ(LeetCode-82)
数据结构·算法·leetcode·链表
小尧嵌入式22 分钟前
【Linux开发一】类间相互使用|继承类和构造写法|虚函数实现多态|五子棋游戏|整数相除混合小数|括号使用|最长问题
开发语言·c++·算法·游戏
Remember_99322 分钟前
【JavaSE】一站式掌握Java面向对象编程:从类与对象到继承、多态、抽象与接口
java·开发语言·数据结构·ide·git·leetcode·eclipse