我一直在Java中实现这个面试问题。一个相当简单的问题,具有额外的大小约束:
从链表末尾查找链表大小未知的第N个节点
我不关心这个问题的解决方案,因为我已经想好了。
相反,我想知道我的实现是否保持了有经验的程序员在编码与链表及其实现相关的问题时所保持的编码约定.下面是我对上述问题的实现:
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));
}
}
附言-我知道Java中有一个链表的内置实现,但我不想使用它。我想知道这个问题的实施是否足够好,或者是否有更好的方法来解决与链表相关的问题?
关于代码约定:
- 泛型类型通常定义为一个大写字母:E或T,但不是AnyType,它看起来像是一个具体的类型
- 运算符应该用空格、分号和空格等括起来。例如,
for(int i =0;i<n;i++)
应该是for (int i = 0; i < n; i++)
- 方法
printNthLastNode()
应该打印最后第n个节点,而不是返回它。返回它的方法应该命名为getNthLastNode()
或findNthLastNode()
。顺便说一句,此方法不会返回节点,而是返回存储在列表中的值 - 方法通常不应该是包私有的。一般来说,它们应该是公开的或私人的
- Java中通常的惯例是在行的末尾使用大括号,而不是在下一行的开头
- 如果列表为空或不够大,则方法
printNthLastNode()
将以NPE失败。应该使用更好的异常类型来表示此问题 - 该类不应该导入
java.io.*
,因为它不使用java.io中的任何类。通常不应该导入包。类应该 String[] args
比String args[]
更可读,并且更传统- Node类应该是静态的:它不使用其封闭类型的任何实例成员
也就是说,面试官应该看到,通过发布的代码,你了解链表是如何工作的,指针是如何工作,以及泛型类型。