题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路
最容易想到的暴力解法,遍历两遍链表,一遍求长度,二遍找点,复杂度太高。
本题采用 快慢指针法
:
快指针先遍历k个结点,然后快慢指针同时遍历,快指针到达链表尾,则慢指针正处在倒数第K个结点的位置。
具体代码
- C++
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode *quick = pListHead;
ListNode *slow = pListHead;
if(pListHead == NULL || k < 0)
return NULL;
while(k > 0){
if(quick!=NULL){
quick = quick->next;
k --;
}
else
return NULL;
}
while(quick != NULL){
quick = quick->next;
slow = slow->next;
}
return slow;
}
};
- Java
/*
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 quick = head;
ListNode slow = head;
while(k > 0){
if(quick != null){
quick = quick.next;
k --;
}
else
return null;
}
while(quick != null){
quick = quick.next;
slow = slow.next;
}
return slow;
}
}