现在我正在准备编码面试,我有一个关于Java链表的问题。你能告诉我一些可靠的来源,我可以从那里学习和实践基本的链表方法。我喜欢这个:www.cs.cmu.edu/~adamchik/15-121/structions/linked%20lists/code/linkedlist.java,但我对一些方法实现感到困惑。例如,方法E get(int pos)返回的不是node,而是位于pos位置的节点中包含的数据E。在这里http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/linkedlist.java#LinkedList中,方法Node Node(int index)返回该位置的节点(而不是其中包含的数据)。我应该遵循哪个实现?
数据结构是一个非常概念性和基于上下文的学科。每个数据结构的各种实现都基于数据结构的需求和范围。
甚至可以认为集合API
的LinkedList
实现有缺陷,因为如果多个线程同时在它上工作,它就不能很好地工作。然后需要从Collections
类中创建一个SynchronizedList
,或者至少需要使用一个能够很好地处理多个线程的实现。
遵循最起码可行的约定,因为面试官不会只问您LinkedList
实现。面试官想知道的是你的概念和编码技能是否达到一定的标准。
请考虑如何使用链表
。为此,您必须考虑实际考虑的LinkedList
类型,因为有许多不同类型的LinkedList
、DoublyLinkedList
、SkipList
等。
考虑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();
}
}
正如您所看到的,我的实现可能不同于您可能在其他地方找到的实现。只要数据结构的概念没有发生根本性的变化,只要它能正确地使用其定义的接口,微小的差异就不是什么问题。
问题内容: 我想在Java中实现方法链接。 我该如何实现? 还请告诉我何时使用它。 我想创建可以按如下方式使用的方法链接: 或喜欢 或喜欢 问题答案: 让你的方法返回如下: 这样,每次调用其中一个方法后,你将获得返回的同一对象,以便可以调用另一个方法。 当你要在对象上调用一系列方法时,此技术很有用:它减少了实现该方法所需的代码量,并允许你在方法链之后使用单个返回值。 减少显示对话框所需的代码量的一
我试图为类分配实现一个双重链表。我目前正忙于实现一个方法来移除指定索引处的节点。 该方法可以移除链表中除索引0以外的任何指定节点。我想问题可能出在我的add方法上,但我不太确定。
本文向大家介绍C语言实现单链表实现方法,包括了C语言实现单链表实现方法的使用技巧和注意事项,需要的朋友参考一下 C语言实现单链表实现方法 链表和我们之前实现过的顺序表一样,都是简单的数据结构,链表分为单向链表、双向链表、循环链表。而单向链表又分为两种实现方法,一种为带头节点的单链表,一种为不带头节点的单链表。我们来具体看看不带头节点的单链表的实现 单链表:它是一种链式存储的线性表,用一组地址任意的
本文向大家介绍Java实现删除排序链表中的重复元素的方法,包括了Java实现删除排序链表中的重复元素的方法的使用技巧和注意事项,需要的朋友参考一下 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多
问题内容: 在回答前面的一些问题以及最近的工作时,我一直在想为什么Java不支持其内置类中的方法链接。 例如,如果我要创建一个类,可以通过以下方法而不是void来使其 可链接: 内置库为什么不倾向于以这种方式执行操作?方法链接有不利之处吗? 我可能忽略了一些可以解释缺少方法链接的内容,但是任何默认返回void的setter方法都应该返回 对此 的引用(至少在我看来应该如此)。这样可以使以下情况更加
问题内容: 在回答前面的一些问题以及最近的工作时,我一直在想为什么Java不支持其内置类中的方法链接。 例如,如果我要创建一个类,可以通过以下方法而不是void来使其 可链接: 内置库为什么不倾向于以这种方式执行操作?方法链接有不利之处吗? 我可能忽略了一些可以解释缺少方法链接的内容,但是任何默认返回void的setter方法都应该返回 对此 的引用(至少在我看来应该如此)。这样可以使以下情况更加