实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
输入:1->2->3->4->5 和 k = 2
输出: 4
方法一:
int kthToLast(struct ListNode* head, int k){
int count=0;
int i;
int res;
struct ListNode *p = head;
while(p!=NULL){
p = p->next;
count++;
}
p = head;
for(i = 0;i<count-k;i++){
p = p->next;
}
res = p->val;
return res;
}
先循环得出链表长度,链表长度-k+1为正序数,遍历寻找输出,较为蠢。
方法二:
int kthToLast(struct ListNode* head, int k){
struct ListNode* fast=head,*slow=head;
while(fast){//当 fast为空时,slow正好指向倒数第 K 个结点
if(k>0){ //若 k 大于0 ,则 flash 先跑
fast = fast->next;
k--;
}else{
fast = fast->next;
slow = slow->next;
}
}
return slow->val;
}
双指针用法,倒数第k个,就让一个指针先跑k个结点。复杂度小于上面那个。