面试题 02.02. 返回倒数第 k 个节点(C++)

题目

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

说明:

给定的 k 保证是有效的。

分析与题解

对于"倒数第k个元素的问题"。设有两个指针 p 和 q,初始时均指向头结点。首先,先让 p 沿着 next 移动 k 次。此时,p 指向第 k+1个结点,q 指向头节点,两个指针的距离为 k 。然后,同时移动 p 和 q,直到 p 指向空,此时 p 即指向倒数第 k 个结点。可以参考下图来理解:

image-20200814143522102

以长度为4,k=2为例,为方便理解画了一个不存在于内存的空结点

代码如下:

/**
 * 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 *p=head;
        ListNode *q=head;
        while(k--){
            p = p->next;
        }
        while(p!=nullptr){
            q=q->next;
            p=p->next;
        }
        return q->val;
    }
};
posted @ 2020-08-14 14:48  脱线森林`  阅读(147)  评论(0编辑  收藏  举报