题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:
Step1. 设置两个指针slow和fast,初始时均指向头结点
Step2. slow不动,fast向前走k-1步
Step3. 然后两个指针同时向前走,直到fast走到链表的结尾,此时slow指向的就是倒数第k个节点。
注意特殊输入:
输入空指针的情况
链表长度小于k的情况
k为0的情况
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head, int k) {
if(head == null) {
return head;
}
if(k == 0) {
return null;
}
ListNode slow = head, fast = head;
boolean overLength = false; //k是否超过长度
while(--k != 0) {
fast = fast.next;
if(fast == null) {
overLength = true;
break;
}
}
if(overLength) {
return null;
}
while(fast.next!=null) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
写法2:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if (head == null) return null;
ListNode p = head;
while (k > 0) {
if (p == null) {
return null;
}
p = p.next;
k--;
}
while (p != null) {
p = p.next;
head = head.next;
}
return head;
}
}
快慢指针相关题目:
1、求链表的中间结点。当快指针走到链表末尾时,慢指针刚好走到链表的中点。
2、判断单链表是否有环。如果快指针追上慢指针,说明有环;反之,当快指针走到链表的结尾时还没有遇到慢指针,说明没有环。