面试题02.02.返回倒数第K个节点
原题链接 :面试题02.02.返回倒数第K个节点
题目
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int kthToLast(ListNode* head, int k) {
}
};
题解:使用快慢指针解法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int kthToLast(ListNode* head, int k) {
ListNode *fast = head;
ListNode *slow = head;
while(k){
fast = fast->next;
k--;
}//让快指针fast领先慢指针K个节点
while(fast != NULL){
slow = slow->next;
fast = fast->next;
}//快指针fast到达链接最末端,此时慢指针slow所值节点即为倒是第K个节点
return (slow->val);
}
};
此题采用快慢指针方法,先定义两个节点指针分别fast
和slow
,让其同时指向头结点,然后通过一个while循环让fast
领先slow
k个节点。然后通过遍历整个链表,当fast=NULL
时(即fast
指向单链表最后一个节点的指针所指向的地方),slow
指针所指的节点就是倒数第k个节点。最后返回该节点的值slow->val
即可。
该算法的时间复杂度为O(n)
。`