剑指offer-链表中倒数最后k个结点C++实现

剑指offer-链表中倒数最后k个结点C++实现

原题链接
在这里插入图片描述

 struct ListNode {
	int val;
 	struct ListNode *next;
 	ListNode(int x) : val(x), next(nullptr) {}
  };

class Solution {
public:
    ListNode* FindKthToTail(ListNode* head, int k) {
        ListNode *cur = head;
        // 初始化链表长度
        int size = 0;
        // 链表长度
        while(cur!=nullptr){
            size++;
            cur = cur->next;
        }
        // 根据题意,返回空链表
        if(size<k)return nullptr;
        cur = head;
        // 根据size-k的思路查找目标
        while(size>k){
            cur = cur->next;
            size--;
        }
        return cur;
    }
};

思路:
这是一道简单的链表题,使用顺序查找即可实现,题目要求找的是倒数第k个结点,已知链表的长度为size,那么倒数第k个结点其实就是size-k个结点(下标从0开始,从1开始就是size-k+1),根据这个思路进行遍历就能定位到目标结点了。
时间复杂度O(n),空间复杂度O(1)

快慢指针解法

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:  
    ListNode* FindKthToTail(ListNode* head, int k) {
        fast = head;
        slow = head;
        // 快指针移动k步,到达第k+1个结点
        while (fast != nullptr && k > 0) {
            fast = fast->next;
            k--;
        }
        // 若k长度大于0,则说明k的长度大于链表的长度
        if(k>0)return nullptr;

		// 当fast指针到达第k+1个结点时,slow指针和fast指针同步向后走,直到fast指针指向空时,返回slow指针的结点就是目标结点
        while (fast != nullptr) {
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }  
private:
    ListNode *fast = nullptr;
    ListNode *slow = nullptr;
};

思路:
利用快慢指针找到目标值,首先将快慢指针同时指向头部结点,然后让快指针走k步,到达第k+1个结点的位置,然后快慢指针同步向后走,当快指针指向空时,返回慢指针的结点就是目标结点了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值