本次写的题目是链表中倒数第k个结点,为牛客网里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

在写这道题我们可以特别直接地想出第一种解决方法:暴力解法。
这种解法是将整个链表遍历一遍后得到了链表长度后,再遍历一遍数组,直到找到倒数第k个结点,但这种解法的还不够简便。
该方法用到的还是快慢结点的技巧,但是与之前的快慢结点技巧不同的是,原本的快慢结点是让快结点两步两步走,然后慢结点一步一步走。在本题中的快慢结点技巧是让快结点先走k步,然后快慢结点一起一步一步走。
最初的快慢结点技巧👇:

本题中使用到的快慢结点技巧👇:

使用该技巧后不需要将链表遍历多遍,大大提升了效率😎
在我们正式写代码前,先考虑一下有无特殊情况,在本题中要考虑的是三种特殊情况:①当链表为空链表的时候;②当要k的数值为小于或者等于0的时候;③当k的数值大于其本身链表长度的时候。
处理前两个特殊情况,只需写出下面的代码👇:
- public class Solution {
- public ListNode FindKthToTail(ListNode head,int k) {
- if(head==null) return null; //当链表中没有结点的时候,我们直接返回null
- if(k<=0) return null; //当k小于或等于0的时候,没有该种结点,返回null
- }
- }
而要解决第三种特殊情况,我们则需要在快结点跑第k位置上的时候进行判断👇:
- public class Solution {
- public ListNode FindKthToTail(ListNode head,int k) {
- if(head==null) return null; //当链表中没有结点的时候,我们直接返回null
- if(k<=0) return null; //当k小于或等于0的时候,没有该种结点,返回null
- ListNode cur = head;
- ListNode quick = head;
- while(k>0){
- quick = quick.next;
- if(quick==null&&k>1){ //当已经为null而k还是大于1的时候,证明k大于链表的整个长度了
- return null;
- }
- k--;
- }
- while(quick!=null){
- quick = quick.next;
- cur = cur.next;
- }
- return cur;
- }
- }
至此,代码就写完了😎跑一遍逝逝吧

nice😎✨
以上!便是全部的啦😎
又是收获满满的一天~