思路1:首先计算链表长度,让链表长度-倒数第k得到的数字(ret),定义一个变量cur指向头节点,让cur走上ret次,即可找到倒数第k个节点
class Solution {
public int size(ListNode head){
if(head==null){
return 0;
}
ListNode cur=head;
int count =0;
while (cur!=null){
count++;
cur=cur.next;
}
return count;
}
public int kthToLast(ListNode head, int k) {
int count=size(head);
ListNode cur=head;
int ret=count-k;
while(ret!=0){
cur=cur.next;
ret--;
}
return cur.val;
}
}
思路1需要遍历链表两次,有没有只遍历一次,就能找到倒数第k个节点呢?
思路2:定义那个变量指向头节点分别为fast和slowfast比slow多走k步,当fast指向的对象为空时,slow就指向倒数第k个节点啦
1.初始化双指针 fast , slow都指向头节点 head ;
2.先令 fast 走 k 步,此时fast , slow 的距离为 k ;
3.令 fast , slow一起走,直到 cur 走过尾节点时跳出,此时 pre 指向「倒数第 k 个节点」,返回之即可
class Solution {
public int kthToLast(ListNode head, int k) {
ListNode fast=head;
ListNode slow=head;
while(fast!=null){
while (k!=0){//让fast多走k步
fast=fast.next;
k--;
}
fast=fast.next;
slow=slow.next;
}
return slow.val;
}
}