一、题目描述
输入一个链表,输出该链表中倒数第k个结点
二、题目分析
考虑到输出倒数第k个结点,“倒数”,想到了栈。
import java.util.*;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
//是空的话返回Null
if( head == null ) return null;
Stack<ListNode> stack = new Stack<ListNode>();
ListNode first = head;
//将头结点放进来
stack.push(first);
//把剩下的结点放进来
while( first != null ){
first = first.next;
stack.push(first);
}
//如果k大于了stack的长度,放回null
if( k >= stack.size() ) return null;
//将倒数的k-1个pop出去
for( int i = 0;i < k;i++ ){
stack.pop();
}
//返回倒数第k的元素
return stack.pop();
}
}
运行结果:
三、一个比较巧妙的方法
两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了
import java.util.*;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode p, q;
p = q = head;
int i = 0;
for (; p != null; i++) {
if (i >= k)
q = q.next;
p = p.next;
}
return i < k ? null : q;
}
}