题目描述
输入一个链表,输出该链表中倒数第k个结点。
方案一
分析:
- 编写一个方法,接收head节点和k
- 先把链表从头到尾遍历,得到链表的总长度n
- 从链表的第一个开始遍历到(n-k)个
代码实现:
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null){
return null;
}
int count=1;
ListNode node=head;
// 获取链表的长度
while(head.next!=null){
head=head.next;
count++;
}
// 校验k的值
if(k>count || k<0){
return null;
}
// 获取正确的数据
for(int i=0;i< count-k;i++){
node=node.next;
}
return node;
}
方案二:
分析:
- 设置两个指针,一个快指针(fast)一个慢指针(slow)
- 让fast指针先行k步
- 慢指针再开始执行
注意:快指针先执行的时候要注意快指针不能为空,如果快指针已经为空了,那么证明k的值超出了链表的长度
代码实现:
public ListNode FindKthToTail(ListNode head,int k) {
if( head==null){
return null;
}
// 快指针
ListNode fast=head;
while(k>0){
if (fast==null){
return null;
}
fast=fast.next;
k--;
}
// 慢指针
ListNode slow=head;
while(fast!=null){
slow=slow.next;
fast=fast.next;
}
return slow;
}