输入一个链表,输出该链表中倒数第k个结点。
方法一:
采用栈,先将数组全部压入栈,再取出第k个结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
import java.util.Stack;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
Stack<ListNode> stack = new Stack<>();//建立栈
if(head == null)return null;
while(head!=null){
stack.push(head);//入栈
head = head.next;
}
ListNode p = new ListNode(0);//新建一个结点用来存储pop出来的栈
if(k>stack.size()||k<1)return null;//如果k>栈的大小或小于1,则返回空
for(int x=1;x<=k;x++){
p = stack.pop();//出栈
}
return p;
}
}
方法二:
采用双指针p,q,初始都指向头结点,先让p先走,走到k-1位置,q开始走,两者相同速度,当p走到尾部时,p与q的距离就是k值,此时返回q值即可。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode p = head;//新建P,q分别指向头结点
ListNode q = head;
int count = 0;//计数器
if(k<1)return null;
while(p!=null){
if(count >= k){
q = q.next;
}
p = p.next;
count++;
}
return k>count?null:q;
}
}