题目描述
输入一个链表,输出该链表中倒数第k个结点。

解答:
1.放到栈中进行中转
public class Q_14 {

public ListNode FindKthToTail(ListNode head,int k) {
    Stack<ListNode> stack=new Stack<ListNode>();
    while (head!=null){
        stack.push(head);
        head=head.next;
    }
    int len=stack.size();
    if(len==0||len<k||k==0){
        return null;
    }
    ListNode result=stack.pop();
    while (result!=null){
        k--;
        if(k==0){
            return result;
        }
        result=stack.pop();

    }
    return  null;
}
public static void main(String[] args) {
    ListNode node1=new ListNode(1);
    ListNode node2=new ListNode(2);
    ListNode node3=new ListNode(3);
    ListNode node4=new ListNode(4);
    ListNode node5=new ListNode(5);

    node1.next=node2;
    node2.next=node3;
    node3.next=node4;
    node4.next=node5;
    System.out.println(new Q_14().FindKthToTail1(node1, 5).val);
}

}

2.快慢指针
思想:快指针先前进k位,然后和慢指针同步前进,则慢指针就是倒数k位
public class Q_14 {

public ListNode FindKthToTail1(ListNode head,int k){
    ListNode fast=head;
    ListNode slow=head;

    for (int i = 0; i <k ; i++) {
        if(fast==null){
            return null;
        }
        fast=fast.next;

    }
    while(fast!=null){
        slow=slow.next;
        fast=fast.next;
    }
    return slow;
}

public static void main(String[] args) {
    ListNode node1=new ListNode(1);
    ListNode node2=new ListNode(2);
    ListNode node3=new ListNode(3);
    ListNode node4=new ListNode(4);
    ListNode node5=new ListNode(5);

    node1.next=node2;
    node2.next=node3;
    node3.next=node4;
    node4.next=node5;
    System.out.println(new Q_14().FindKthToTail1(node1, 5).val);
}

}