[剑指Offer] 链表中倒数第k个节点
问题描述
输入一个链表,输出该链表中倒数第k个结点。
分析
使用快慢指针法
初始slow
指针指向头节点,fast
指针头节点后k-1个节点,两个指针都向后移动,直到fast
到达链表尾部
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (pListHead == NULL) return NULL;
ListNode* slow = pListHead;
ListNode* fast = pListHead;
while(--k > 0) {
if (fast->next != NULL) {
fast = fast->next;
} else {
return NULL;
}
}
while (fast->next != NULL) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
简洁点可以将两个while合并成一个
这个是用java写的因为C++版的死活不通过,后来才发现C++版的k
是unsigned int
,不会 < 0,可以直接删掉unsigned
或者用个int
存下k
就能通过了
public ListNode getKthFromEnd(ListNode head, int k) {
if (head == null) return head;
ListNode fast = head;
ListNode slow = head;
while (fast != null) {
if (--k < 0) {
slow = slow.next;
}
fast = fast.next;
}
if (k > 0) return null;
return slow;
}