【问题标题】:Linked List in Java method implementationJava方法实现中的链表
【发布时间】:2014-03-22 17:29:26
【问题描述】:

现在我正在准备编码面试,我有 1 个关于 Java 链表的问题。你能告诉我一些可靠的来源,我可以从中学习和练习基本的链表方法。我喜欢这个:www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/code/LinkedList.java 但我对一些方法实现感到困惑。例如,方法 E get(int pos) 返回 NOT 节点,但返回包含在位置 pos 的节点中的数据 E。虽然在这里http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/LinkedList.java#LinkedList 方法 Node node(int index) 返回该位置的节点(而不是其中包含的数据)。我应该遵循哪个实现?

【问题讨论】:

  • 一个是Java的LinkedList,另一个是某人出于学术目的所做的实现。
  • 我理解其中的区别,但我在面试时应该遵循哪个约定?面试官期望哪种实施方式?

标签: java linked-list


【解决方案1】:

嗯,数据结构是一门非常概念化和基于上下文的学科。每个数据结构存在的各种实现基于数据结构的要求和范围。
甚至可以争辩说,Collection APILinkedList 实现是错误的,因为如果多个线程同时在它上面工作,它就不能很好地工作。然后需要制作来自Collections 类的synchronizedList,或者至少需要使用一个适用于多线程的实现。

遵循让你前进的最小可行约定,因为面试官不会只问你一个LinkedList 的实现。面试官想知道的是你的概念和编码技能是否达到了一定的分数。

想想你可以用Linked List 做什么。为此,您必须考虑您实际考虑的是哪种类型的LinkedList,因为有许多不同类型的LinkedLists,例如SinglyLinkedListDoublyLinkedListSkipList 等。

考虑到SinglyLinkedList,你的LinkedList实现至少应该有以下方法:add()remove()contains()clear()size()

以下是我对SinglyLinkedList 的实现:

import java.util.Iterator;
import java.util.StringJoiner;

public class LinkedList<T> implements Iterable<T>
{
  private Node head;
  private Node tail;
  private int size;

  private class Node
  {
    private T value;
    private Node next;

    public Node(T value)
    {
      this.value = value;
    }
  }

  public void add(T value)
  {
    Node node = new Node(value);

    if (head == null)
    {
      head = node;
    }
    else
    {
      tail.next = node;
    }

    tail = node;
    ++size;
  }

  public boolean remove(T value)
  {
    Node previous = null;
    Node current = head;

    while (head != null)
    {
      if (current.value.equals(value))
      {
        if (previous != null)
        {
          previous.next = current.next;

          if (current.next == null)
          {
            tail = previous;
          }
        }
        else
        {
          head = current.next;

          if (head == null)
          {
            tail = null;
          }
        }

        --size;
        return true;
      }

      previous = current;
      current = current.next;
    }

    return false;
  }

  public boolean contains(T value)
  {
    Node current = head;

    while (current != null)
    {
      if (current.value.equals(value))
      {
        return true;
      }

      current = current.next;
    }

    return false;
  }

  public void clear()
  {
    head = null;
    tail = null;
    size = 0;
  }

  public int size()
  {
    return size;
  }

  @Override
  public Iterator<T> iterator()
  {
    return new Iterator<T>()
    {
      private Node current = head;

      @Override
      public boolean hasNext()
      {
        return current != null;
      }

      @Override
      public T next()
      {
        Node next = current;
        current = current.next;
        return next.value;
      }
    };
  }

  @Override
  public String toString()
  {
    StringJoiner joiner = new StringJoiner(", ");

    for (T value : this)
    {
      joiner.add(value.toString());
    }

    return joiner.toString();
  }
}

如您所见,我的实现可能与您在其他地方找到的实现不同。只要数据结构的概念没有发生根本性的改变,只要它与定义的接口一起正常工作,微小的差异就不是问题。

对于像数据结构这样的学科,您必须自己思考并根据您的要求,使用或实施适合您需求的数据结构。就面试而言,最小可行数据结构的实现就是您需要展示的所有内容,并且所有这些都是必需的。只需确保这种最小可行数据结构在其上下文中没有错误即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多