输入一个链表,输出该链表中倒数第k个结点。
解析:①笨方法:获取链表长度,寻找倒数第k个结点的正数位置:totalNum - k + 1;
②双指针:两个指针相距k,同时向后遍历,当快指针遍历到尾部null时,慢指针指向倒数第k个结点
代码:
①
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
int totalNum = 0;
if(head != null){
totalNum++;
}else{
return null;
}
ListNode currentNode = head.next;
while(currentNode != null){ //计算链表长度
totalNum++;
currentNode = currentNode.next;
}
if(totalNum < k){
return null;
}
//获取倒数第k个节点,即正数第totalNum-k + 1个节点
ListNode nodeK = head;
for(int i = 1; i <= totalNum-k; i++){
nodeK = nodeK.next;
}
return nodeK;
}
}
*****************************************************************************************************
②
/*
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 fast = head;
ListNode low = head;
int a = k;
//记录链表长度
int totalNum = 0;
while( fast != null){
//快指针先跑啊
fast = fast.next;
totalNum++;
//等快指针跑完k,慢指针开始跑
if(k < 1){
low = low.next;
}
k--; //放在这个位置是为了保证快指针跑完k-1后,慢指针再开始跑
}
if(totalNum < a){
return null;
}
return low;
}
}