原文:
Implement an algorithm to find the nth to last element of a singly linked list.
译文:
实现一个算法从一个单链表中返回倒数第n个元素。
创建类LinkedListNode
public class LinkedListNode {
int data;
LinkedListNode next;
public LinkedListNode(int data) {
this.data = data;
this.next = null;
}
}
使用两个指针,first和second,当second.next==null时,first为倒数第(second-first)个节点
public static LinkedListNode lastNth(LinkedListNode head, int n) {
if (head == null || n < 1) {
return null;
}
LinkedListNode first = head;
LinkedListNode second = head;
while (n > 1) {
if (second == null) {
// n is more than the length of the linked list
return null;
}
second = second.next;
n--;
}
while (second.next != null) {
first = first.next;
second = second.next;
}
return first;
}
junit testcase
@Test
public void testLastNth() {
System.out.println("lastNth");
LinkedListNode head = null;
LinkedListNode tmp = null;
int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
for (int i = 0; i < a.length; i++) {
LinkedListNode next = new LinkedListNode(a[i]);
if (i == 0) {
head = tmp = next;
continue;
}
tmp.next = next;
tmp = next;
}
assertEquals(null, q2_2.lastNth(head, 0));
assertEquals(null, q2_2.lastNth(head, 11));
assertEquals(1, q2_2.lastNth(head, 1).data);
assertEquals(8, q2_2.lastNth(head, 8).data);
assertEquals(null, q2_2.lastNth(null, 8));
}