【问题标题】:In case the example data structure is considered to be a Linked List, how does one write a function which does print out all of its members?如果示例数据结构被认为是一个链接列表,如何编写一个打印出所有成员的函数?
【发布时间】:2021-02-03 11:31:25
【问题描述】:

我刚开始学习链表进行技术面试,所以这个问题可能看起来有点奇怪。

我正在阅读来自 freecodecamp 的关于 Linked List 的介绍文章,这就是文章的内容

在 JavaScript 中,链表如下所示:

const list = {
    head: {
        value: 6
        next: {
            value: 10                                             
            next: {
                value: 12
                next: {
                    value: 3
                    next: null 
                    }
                }
            }
        }
    }
};

我的问题是,这是一个真正的链接列表吗?假设我收到一个问题“打印出以下链表中的所有元素,并自己实现一个链表”。我可以只使用上面的代码吗?我确实知道如何使用类来实现链表,但我只是想知道上面的代码是否算作链表。

我问这个问题是因为到目前为止我只知道如何解决数组算法问题。 假设我想打印出数组中的所有元素。我需要三个步骤。

  1. 创建一个数组。 // 数字 = [1,2,3];
  2. 编写一个函数将其打印出来。 // function printNums(Nums){ for (...){console.log(Nums[i]}}
  3. 调用函数。 // printNums(Nums);

所以现在,我想做一个链接列表版本。我该怎么做?

新更新:

这是我打印出所有元素的 LinkedList 版本。正如评论所述,我在代码中所做的实际上是一个链表,但它不称为实现。但是如果我只是想测试我的功能呢?下面的代码对你们有意义吗?

【问题讨论】:

标签: javascript linked-list iteration


【解决方案1】:

技巧是使用while循环直到下一个元素为空。

let prev: LinkedListElement<T> | null = this._start;
let finalEl: LinkedListElement<T> = prev;
let counter = 0;
while (prev !== null) {
    const retVal = callback(prev, counter);
    if (!retVal) {
    break;
    }
    finalEl = prev;
    prev = prev.next;
    counter++;
}

让我知道这是否有效。
另请查看我创建的这个 LinkedList 类,traverse 函数符合您的要求。
Class GitHub
NPM package - @dsinjs/linked-list
Complete documentation

【讨论】:

    【解决方案2】:

    我的问题是,这是一个真正的链接列表吗?

    是的,是的。您有一个数据元素的集合,其中每个数据元素都指向下一个。

    假设我收到一个问题“打印出以下链表中的所有元素,并自己实现一个链表。”我可以只使用上面的代码吗?

    当被要求打印一个特定的链表时,我们应该假设清楚该链表的确切接口是什么(例如,节点通过名为next 的属性链接,并且它们的值通过属性访问称为value)。在示例列表的情况下,这很清楚。所以是的,您可以使用您提供的代码。

    自己实现链接列表的问题是另一回事。虽然可以理解为定义一个特定的列表,但大多数人不会这样解释这个问题。这更有可能意味着您应该实现一个链表接口:即编写不仅提供构造任何链表的简单方法,而且还可以使用它的代码(查找值、插入节点、删除节点、移动节点……)

    我只是想知道上面的代码是否算作链表。

    是的,您提供的对象字面量是(一个特定实例)一个链表。

    假设我想打印出数组中的所有元素。我需要三个步骤。

        Create an array. // Nums = [1,2,3];
    

    在这里,您利用了 JavaScript 语言的一个特性。这背后隐含一个构造函数:new Array(1, 2, 3)。此构造函数作为核心语言的一部分提供。您还可以访问pushpopindexOfslicesplice 等方法。开箱即用。

    与链表的不同之处在于核心 JavaScript 不为其提供实现。你必须自己扔。当然,您可以使用对象字面量来创建一个链表,但这是一种非常冗长的方式(想象一个包含 100 个数字的列表),并且容易出错(如果您在中途某个地方拼错了 next 怎么办?)

    所以现在,我想做一个链接列表版本。我该怎么做?

    如果目的只是打印链表的内容,而不是别的,你可以像以前那样做。但是要获得像开箱即用的数组那样提供接口的东西,您需要编写一个包含一些有用方法的类,这样您就可以编写:

    let myList = LinkedList.from(6, 10, 12, 3);
    console.log(...myList.values()); // outputs 6 10 12 3
    

    但是如果我只是想测试我的功能呢?下面的代码对你们有意义吗?

    是的,没关系。如果您知道您的打印函数将获得null 或具有valuenext 属性的对象,其中next 属性可以是null 或另一个这样的对象,...那么很好.换句话说:你需要知道接口

    【讨论】:

    • 感谢您的长篇回复!我现在明白了。起初我只是好奇如何像对数组一样测试我的函数。我从未想过轻松创建数组是语言特性的一部分,而创建数组也是在幕后使用构造函数。
    【解决方案3】:
    var l = head;
    while (l != null) {
        console.log(l.value);
        l = l.next;
    }
    

    【讨论】:

    • 感谢您的回答,但这并不是我真正要问的。你介意看一下问题描述吗?
    • @Fin,你问“所以现在,我想做一个链接列表版本。我应该怎么做?”,这是我提供的。您需要做的就是将其放入函数体中。
    • 我要问的是如何知道函数是否正确。为此,我需要先创建一个链表。所以问题中的第一块代码是我创建链表的快速方法。我想知道WAY是否正确。 (帽子是为了强调,如果这让你不舒服,对不起)。这更像是一个笼统的问题,而不是问“如何打印出列表中的所有元素”。
    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多