【问题标题】:Clarify the working of add and printNodes functions in this code在此代码中阐明 add 和 printNodes 函数的工作
【发布时间】:2018-04-27 13:28:01
【问题描述】:

在这段代码中,我可以理解使用 X 进行动态类型转换。但我无法理解 add 函数是如何真正加载数据的。

请任何人帮助我详细了解 add 和 printNodes 方法的逐步执行。谢谢

class UsingGenericsForLinkedList[X] {
  private class Node[X](elem: X) {  
    var next: Node[X] = _  
    override def toString = elem.toString  
  }  
  private var head: Node[X] = _  

  def add(elem: X) { //Add element in the linekd list  
    val value = new Node(elem)  
    value.next = head  
    head = value  
  }    

  private def printNodes(value: Node[X]) { // prining value of the nodes  
    if (value != null) {  
      println(value)  
      printNodes(value.next)  
    }  
  }  
  def printAll() { printNodes(head) } //print all the node values at a time  
}

【问题讨论】:

    标签: scala class generics types parameters


    【解决方案1】:

    在(单)链表中,维护单元格(此处为Node 类),其中包含元素有效负载和指向下一个单元格的指针。这里有一个可变链表,所以next 指针可以更新(可变vars)。外部结构保持一个指向head 的指针,它是列表的第一个节点,最初是null,表示一个空列表。当您遍历时,您会在head 中找到第一个节点,然后对其有效负载执行一些操作(有效负载是Node 中的elem,仅在此处通过toString 提供),然后通过查看重复该过程next 指针,直到变为 null

    注意add替换了head,并将head之前的值放入新插入节点的next字段中。所以从技术上讲,这个 prepends 一个元素到列表中,它将成为第一个被找到的元素。所以如果你做add(1), add(2), add(3),你会得到遍历3, 2, 1。这相当于 Scala 的默认 List 类中的 ::

    Here 是关于 Scala(不可变)List 类型的教程;唯一的区别是您永远不会替换 nexthead 指针,而是在添加时返回一个新的头单元格。

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多