题解
方法一:
单链表只能向后遍历,只要知道倒数第k个节点是顺数第几个节点即可。
public ListNode FindKthToTail(ListNode head,int k) {
ListNode cur = head;
int count = 0;
//第一遍遍历统计链表节点个数
while(cur != null){
count++;
cur = cur.next;
}
ListNode temp = null;
//倒数第k个节点,顺数第count - k + 1个,可以自己举个例子
for(int i = 1; i <= count - k + 1; i++){
if(head != null){
temp = head;
head = head.next;
}else{
temp = null;
}
}
return temp;
}方法二:快慢指针
快指针先遍历k个节点,之后快慢指针(慢节点指向的是第一个节点,快指针指向的是第k+1个节点)一起遍历,当快指针跳出的时候,慢指针指向的就是倒数第k个节点。
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k == 0){
return null;
}
//统计快指针遍历节点的个数
int count = 0;
ListNode fast = head;
ListNode slow = null;
while(fast != null){
count++;
fast = fast.next;
if(count >= k){
slow = head;
head = head.next;
}
}
return slow;
}方法二比方法一更需注意一些边界条件:k=0和k>链表的总长度。

