java-理解LinkedList与节点的面试问题

时间:2018-03-12 06:40:04

标签: java algorithm generics linked-list singly-linked-list

我目前正在阅读破解编码面试并查看 leetcode 上的问题,并且在这两个地方遇到了同样的困惑。特别是LinkedList问题,通常涉及使用节点和创建链接列表的自定义类实现。现在我明白了LinkedList是什么以及每个元素如何被称为“节点”等等。但是当实际使用LinkedList java数据结构时,这个级别似乎太低了,并且让我感到困惑。

这是否真的与java Collections List / LinkedList api有关?它似乎并非如此。例如,如果我在LinkedList api中搜索“node”,我甚至没有获得一次点击。

采取以下leetcode问题:

  

您将获得两个非空链表,表示两个非负数   整数。数字以相反的顺序存储,每个数字都存储   节点包含一个数字。添加两个数字并将其作为a返回   链表。

     

您可以假设这两个数字不包含任何前导零,除了   数字0本身。

     

实施例

     

输入:(2 - > 4 - > 3)+(5 - > 6 - > 4)

     

输出:7 - > 0 - > 8

     

说明:   342 + 465 = 807。

读完这个问题后,我去了我的白板并编写了一个解决方案。正如您可能想象的那样,当我将我的答案与解决方案进行比较时,我立刻感到震惊,因为我的代码与第一行的解决方案不同!

我写了以下内容:

public LinkedList<Integer> addLinkedLists(LinkedList<Integer> l1, LinkedList<Integer> l2)

并且解决方案具有以下内容:

public ListNode addTwoNumbers(ListNode l1, ListNode l2)

请解释我似乎缺少的东西。为什么解决方案没有收到实际的LinkedList数据结构?问题清楚地表明返回一个LinkedList,但它返回一个自定义实现的ListNode。我似乎错过了对所问内容的基本理解。

关于leetcode的问题: https://leetcode.com/problems/add-two-numbers/description/

3 个答案:

答案 0 :(得分:3)

这与Java内置LinkedList无关,除了概念。

他们在编程101(或其他所谓的)中教授的一件事是链接列表在一般工作中的方式。

它们通常以单个链接列表开头,如illustrated on Wikipedia,然后将涵盖其他类型的链接列表,例如双向链表(这是内置Public HttpResponseMessage CallTestMethod() { // SetupPath(); setting Rpackage and ODBC package paths in environment no issue with this method. REngine engine; engine = REngine.GetInstance(); //Mentioned R Script file path var val = engine.Evaluate("source('C:/Folder/RProject1/Script.R')"); //Call FetchDatawithoutParam () and get data frame values in dsResult . var dsResult = engine.Evaluate(@"TempDataResult <- FetchDatawithoutParam ()").AsDataFrame(); } 的实现方式)。有关链表类型的完整列表,请参阅维基百科文章(第3节)。

在单链表中,列表由节点组成,每个节点都有一个FetchDatawithoutParam <- function() { dbConnection <- odbcDriverConnect('driver={SQL Server};server=.;database=DBName;trusted_connection=true') DataResult <- sqlQuery(dbConnection, "SELECT * FROM TableName;") return(DataResult ); odbcClose(dbConnection) } 和一个对LinkedList节点的引用。在完整列表实现中,节点是value类的内部(类似于next),但是对于简单/早期实现,只存在List类,并且列表由对列表的“head”/第一个节点的引用表示。

问题正在使用的是这种过于简单的列表类型。如果你想为这个低级别的编程“破解编码面试”,你应该研究链表如何在内部工作。

您可以阅读维基百科的文章,或在网上搜索有关Java链接列表的资料。

答案 1 :(得分:1)

虽然@Andreas的答案很好,而且更高级别,但我的误解似乎是我不熟悉leetcode的工作原理以及我查看问题的设备是否提交了解决方案&#34;提交解决方案&#34;部分不容易引人注意。我的错误是认为这是一个独立的问题。我没有在页面底部注意到以下内容,这意味着如何回答这个问题:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

    }
}

答案 2 :(得分:0)

在采访中,面试官实际上不会告诉你功能签名是什么样的。您必须根据面试问题决定功能签名(当然,受访者在编写代码之前应与面试官讨论)。

对于此问题,LinkedList是一个黑盒子,只有几个API可供使用。因此循环列表实际上将采用O(n ^ 2)。因为对于每个元素,您必须从头部或尾部开始并逐步移动到所需位置。但是,使用ListNode可以获得更多自由,因此您可以将列表循环到O(n),这也是此问题的优化时间复杂度。