Javascript 用于获取链表的长度
链表是一种线性数据结构,它的长度可以随意变化,这是数组所不能做的,因为数组的长度是固定的。在本文中,我们将通过实现代码并处理边界情况来找到给定链表的长度。我们将在本文中使用while循环和类的概念。
问题简介
在给定的问题中,我们有一个链表,首先我们需要使用类创建该链表,然后我们需要找到给定链表的长度。由于链表的长度可以发生变化,因此我们将在代码的特定部分找到链表的长度。
我们将采用两种方法,一种是直接迭代方法,使用while循环,另一种是递归方法来找到给定链表的长度。
迭代方法
在这种方法中,我们首先使用类来创建一个链表,为链表提供结构。我们将定义一些函数,例如push函数,通过传入头部和数据来向链表中添加值。
示例
在这个过程中,我们将使用while循环、头部或链表的起始节点,以及一个变量来计算链表中的节点数,即给定链表的长度。
// creating the linked list node
class Node{
constructor(data) {
this.value = data;
this.next = null;
}
}
function push(tail, data){
var new_node = new Node(data);
tail.next = new_node;
tail = tail.next;
return tail
}
function length(head){
temp = head;
var count = 0
while(temp != null) {
count++;
temp = temp.next;
}
return count;
}
var head = new Node(1);
var tail = head;
tail = push(tail, 2)
tail = push(tail, 3)
tail = push(tail, 4)
tail = push(tail, 5)
tail = push(tail, 6)
console.log("Length of the given linked list is: " + length(head))
在上述给定的方法中,我们不使用任何额外的空间,并且只遍历一次链表。因此,上述方法的时间复杂度是O(N),其中N是链表的大小,上述方法的空间复杂度是O(1)。
递归方法
在这种方法中,我们将按照与上述方法中创建链表相同的步骤进行操作,对于主要任务,我们将使用递归方法。
示例
从函数本身调用具有特定基本条件的不同参数的相同函数称为递归。在这种方法中,我们将使用链表的头部调用函数,然后从函数中再次调用函数,但是参数是当前节点的下一个节点。作为返回值,我们将返回1 + 递归调用的返回值,结果将在第一次调用中给出。让我们看看代码−
// creating the linked list node
class Node {
constructor(data) {
this.value = data;
this.next = null;
}
}
function push(tail, data) {
var new_node = new Node(data);
tail.next = new_node;
tail = tail.next;
return tail
}
function length(cur) {
if(cur == null) return 0;
return 1 + length(cur.next);
}
var head = new Node(1);
var tail = head;
tail = push(tail, 2)
tail = push(tail, 3)
tail = push(tail, 4)
tail = push(tail, 5)
tail = push(tail, 6)
console.log("Length of the given linked list is: " + length(head))
时间和空间复杂度
递归方法的时间复杂度为O(N),其中N是给定链表中的节点数。上述代码的空间复杂度为O(N),因为总共有N个调用,每个调用都需要维护当前节点堆栈。
结论
在本教程中,我们学习了如何通过实现代码并处理边界情况来找到给定链表的长度。我们在第一种方法中使用了while循环和类概念,并在第二种方法中使用了递归方法来找到长度。这两种方法的时间复杂度都为O(N),其中N是链表的长度,而递归方法的空间复杂度由于堆栈大小为O(N)。