实现一种算法,找出单向链表中倒数第 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个结点。复杂度小于上面那个。