【问题标题】:Optimal ways to Traverse through a LinkedList - Java遍历 LinkedList 的最佳方法 - Java
【发布时间】:2013-10-29 01:42:31
【问题描述】:

情况

我明天接受 TripAdvisor 的采访,我决定练习创建自己的自定义 LinkedList。我正在尝试找出遍历它的最佳方法。

主要问题:我已经设法遍历了我的链接列表,但我相信 有更好的方法来做到这一点。您将如何遍历它?

额外问题:我的整体课程看起来如何?有什么我应该/不应该添加的吗? 它似乎工作正常,但它是最佳的吗?

额外问题 #2:最后我想知道是否有人对我必须知道的典型面试问题/概念有任何见解?

非常感谢。

这是我的课程

// *********************************Node Class*******************************************     
 public class Node<T> {
  Node<T> link;

  T data;

  public Node(T data) {

    this.data = data;
    link = null;

}

public T getData() {
    return data;

}

public Node<T> getLink() {

    return link;

}


public Node<T> setLink(Node<T> N) {

    this.link = N;
    return link;

}

public void setData(T newData) {

    this.data = newData;

}

}

    //****************************************Linked List Class*******************************

   public class LinkedList<T> {

Node<T> head;
T data;


public LinkedList(){
   head = null;
   }




public void add(T data){

    Node<T> newNode = new Node<T> (data);
    newNode.setLink(head);
    head = newNode;
}


  //had problems printing out the data in the last node

 public void traverse(){
    Node<T> pointer;
    pointer = head;

while (pointer.getLink()!=null){
        System.out.println(pointer.getData());
        pointer = pointer.setLink(pointer.getLink());
}

//Fixed problems For last node that doesnt get printed out
System.out.println(pointer.getData());

}

//还有更好的方法吗? //谢谢 }

【问题讨论】:

  • 你面试什么职位?
  • 你为什么不能只使用pointer = pointer.getLink();while (pointer != null) {(并删除你最后的打印语句)
  • 涉及链表的面试问题通常集中在“删除”操作上,因为它有一些有趣的边缘情况。还有一个常见的面试问题是这样的:“你如何检测循环链表或包含循环的链表?”
  • @omalsa04 感谢您的洞察力!不敢相信我自己没有想到那个解决方案

标签: java linked-list traversal


【解决方案1】:

我会把你的遍历函数改成这样:

public void traverse(){
  Node<T> pointer = head;

  while (pointer != null){
    System.out.println(pointer.getData());
    pointer = pointer.getLink();
  }
}

此外,通常将 Node 类表示为 LinkedList 的私有内部类,因为它通常在其他任何地方都不需要。

就面试本身而言,遍历问题对于二叉树来说更为典型(例如,按排序顺序打印出元素)。 LinkedList 问题更侧重于删除/插入操作,这两者都需要仔细注意边缘情况(例如,当您移除头部时会发生什么)。一个更高级的 LinkedList 问题会询问如何检测循环,我会确保我至少知道一种方法(查看Tortoise and the Hare algorithm)。

编辑:

算法问题几乎总是来自以下列表:

  • 字符串操作,例如:
    • 反转字符串
    • 计算每个字母在给定字符串中出现的次数(为此使用地图)
  • LinkedList 问题,例如:
    • 如何移除节点,密切关注移除头部等边缘情况
    • 如何反转linkedList(使尾部成为头部)
  • 二叉树问题,例如:
    • 中序遍历
    • 如果存在 BTree 平衡问题,您不需要实现它,只需了解完全不平衡的二叉树只是一个链表。
    • 了解与链接列表或完全不平衡的二叉树的 O(n) 相比,搜索平衡二叉树的时间为 O(log n)。
  • 您可能会被要求描述您刚刚给出的解决方案的复杂性(大 O 表示法)

有关 Java 本身的问题,请参阅 thisthis

【讨论】:

  • 这里只补充一点,Node 一般是作为私有静态类而不是私有内部类实现的。 --> docs.oracle.com/javase/tutorial/java/javaOO/nested.html,现在我是一个挑剔者 :) 引用 Joshua Bloch 的 Effective Java - Item 22*: Favor static member classes over nonstatic.
猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2012-05-16
  • 2012-03-04
  • 2018-11-01
  • 2012-07-16
  • 2011-04-24
相关资源
最近更新 更多