我一直在 Java 中实施this面试问题。一个相当简单的问题,附加 大小 :
从链接列表末尾找到第N个节点,其中链接列表的大小未知?
我并不关心这个问题的解决方案,因为我已经想到了这个问题。
相反,我想知道我的实现是否维护了编码器在编写与链接列表及其实现相关的问题时所维护的编码约定?。这是我对上述问题的实现:< / p>
import java.io.*;
class NthNodeFromEnd<AnyType>
{
private Node<AnyType> head;
private Node<AnyType> pointer;
private class Node<AnyType>
{
protected AnyType item;
protected Node<AnyType> next;
}
void push(AnyType item)
{
if(isEmpty())
{
head = new Node<AnyType>();
head.item = item;
head.next = null;
pointer = head;
}
else
{
Node<AnyType> newNode = new Node<AnyType>();
newNode.item = item;
newNode.next = null;
pointer.next = newNode;
pointer = pointer.next;
}
}
boolean isEmpty()
{
return head == null;
}
AnyType printNthLastNode(int n)
{
Node<AnyType> ptr1 = head;
Node<AnyType> ptr2 = head;
for(int i =0;i<n;i++)
{
ptr1 = ptr1.next;
}
while(ptr1!=null)
{
ptr1 = ptr1.next;
ptr2 = ptr2.next;
}
return ptr2.item;
}
public static void main(String args[])
{
NthNodeFromEnd<Integer> obj = new NthNodeFromEnd<Integer>();
obj.push(1);
obj.push(2);
obj.push(3);
obj.push(4);
obj.push(5);
obj.push(6);
obj.push(7);
System.out.println("The nth item is = "+obj.printNthLastNode(5));
}
}
P.S。 - 我知道Java中有一个内置的Linked List实现,但我不希望使用它。我想知道这个实现是否正确问题是否足够好或是否有更好的方法来解决与链接列表相关的问题?
答案 0 :(得分:1)
关于代码约定:
for(int i =0;i<n;i++)
应该是for (int i = 0; i < n; i++)
printNthLastNode()
应该打印第n个最后一个节点,而不是返回它。返回它的方法应命名为getNthLastNode()
或findNthLastNode()
。顺便说一句,这种方法不会返回节点,而是存储在列表中的值。printNthLastNode()
将失败并显示NPE。应该使用更好的异常类型来表示这个问题。java.io.*
,因为它不使用java.io中的任何类。通常不应导入包。课程应该。 String[] args
比String args[]
更具可读性,更为传统。也就是说,面试官应该看到,通过发布的代码,您可以了解链接列表的工作方式以及指针的工作方式以及泛型类型。