有两种方式,使用递归和非递归
算法一(非递归方式):
最简单的方式是从头开始遍历。
算法二(递归方式)
打印出第k个元素的值。
public static int nthToLast(LinkedListNode head,int k){
if(head == null){
return 0;
}
int i=nthToLast(head.next,k)+1;
if(i==k){
System.out.println(head.data);
}
return i;
}
算法三(迭代法):
一种效率更高,但不太直观的解法。
LinkedListNode nthToLast2(LinkedListNode head, int k) {
if (k <= 0) {
return null;
}
LinkedListNode p1 = head;
LinkedListNode p2 = head;
//p2向前移动k个结点
for(int i=0;i<k-1;i++){
if(p2.next==null){
return null;
}
p2 = p2.next;
}
if(p2==null){
return null;
}
/*现在以相同的速度移动p1和p2,当p2抵达链表末尾时*/
/*p1刚好指向第k个元素*/
while(p2.next!=null){
p1 = p1.next;
p2 = p2.next;
}
return p1;
}