剑指Offer(Java版)第十八题:输入一个链表,输出该链表中倒数第k个结点。 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。 例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。 这个链表的倒数第3个结点是值为4的结点。

/*
输入一个链表,输出该链表中倒数第k个结点。
为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。
例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。
这个链表的倒数第3个结点是值为4的结点。
*/
public class Class18 {
//利用两个相聚为k-1的指针
static class ListNode{
int val;
ListNode next = null;
ListNode(int val){
this.val = val;
}
}

public ListNode FindThisPoint(ListNode head, int k){
ListNode fast = head;
ListNode slow = head;
if(head == null || k <= 0){
return null;
}
//fast先走k-1步
while(k-- > 1){
if(fast.next != null){
fast = fast.next;
}else{
return null;
}
}
//接着slow跟着fast走
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
return slow;
}

public void test() {
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
node1.next=node2;
node2.next=node3;
node3.next=node4;
ListNode result = FindThisPoint(node1, 1);
if(result.val==4)
System.out.println("test4 passed!");
else
System.out.println("test4 failed!");
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Class18 c = new Class18();
c.test();

}

}

原文地址:https://www.cnblogs.com/zhuozige/p/12451939.html