【发布时间】:2016-09-29 07:24:57
【问题描述】:
在一次工作面试中,我被要求反转一个单链表。这是我的解决方案:
public class E<T>{
private E<T> next;
private T val;
private E(T val) {
this.val = val;
}
public static <T> E<T> createNode(T val){
return new E<T>(val);
}
public E<T> add(E<T> next){
E<T> current = this;
while(current.next != null){
current = current.next;
}
current.next = next;
return this;
}
public E<T> reverse(){
if(this.next == null)
return this;
E<T> previous = new E<>(this.val); //<----- HERE
E<T> current = this.next;
while(current != null){
E<T> tmp = current.next;
this.val = current.val;
this.next = previous;
current.next = previous;
previous = current;
current = tmp;
}
return this;
}
}
但它看起来确实很丑。我无法理解如何处理的问题是,我们最初只有 this 引用,我们无法分配给任何东西(当时我们只是结束了一个循环)。这就是我创建一个新节点的原因。但它看起来是一个糟糕的解决方法。有没有“真正的方法”来做到这一点?
【问题讨论】:
-
你知道
Collections.reverse(List<?> list),对吧? -
我认为他应该在面试中真正了解算法。
-
@Mena 这个问题是纯粹的算法问题,但是是的,我认为类似的东西已经在 JDK 中了。
-
@Alupkers 问题是,即使您在实际算法上进行了测试,而不是您的 Java 知识,您也可以查看
Collections.reverse的源代码。 Java 中与集合相关的东西据说是高度优化的,所以你可以盯着一些相当不错的源代码并从那里找出来(来自 javadoc:“这个方法在线性时间内运行”)。 -
@Mena 是的,我只是看了一下。它使用 两个 迭代器(start-end 和 end-start),这并不能完全满足我的要求。
标签: java linked-list reverse singly-linked-list