Day02

该程序通过输入链表节点数量和值构建链表,然后利用快慢指针技巧寻找链表的倒数第k个节点。快指针先走k步,然后两者同步移动,直到快指针到达链表末尾。当找到这个节点时,慢指针所指向的就是目标节点。这种方法的时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

题目描述

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。

链表结点定义如下:

struct ListNode
{
    int m_nKey;
    ListNode* m_pNext;
};

正常返回倒数第k个结点指针,异常返回空指针.

要求:

(1)正序构建链表;

(2)构建后要忘记链表长度。

数据范围:链表长度满足 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000 ,$ k \le n$,链表中数据满足 0 ≤ v a l ≤ 10000 0 \le val \le 10000 0val10000

本题有多组样例输入

输入描述:

输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值

输出描述:

输出一个整数

示例1

输入:

8
1 2 3 4 5 6 7 8
4

输出:

5

思路:

  • 设置快慢指针, 就是快指针先前进 k步, 然后快慢指针一起往后遍历 直至快指针到链表末端( !=nullptr) 此时慢指针就是指向倒数第k个结点

复杂度

  • O(n) (链表长度)

具体实现 (c++)

#include <iostream>
using namespace std;
struct ListNode{
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL){}
};


int main() {
    int nums;
   
    while(cin >> nums){  // 输入多组数据
        ListNode *pHead = new ListNode(-1);
        ListNode *p = pHead;
        for(int i = 0; i<nums; i++){
                int data;
                cin>>data;
                ListNode *q = new ListNode(data);
                p->next = q;
                p = p->next;
        }
         int kth = 0;
        cin>>kth;
        if(kth == 0) cout << 0<<endl; // 异常情况 处理下 若要的是倒数第0个结点
        ListNode *fast = pHead->next, *slow = pHead->next;

        for(int i = 0; i< kth; i++){
                fast = fast->next;
        }
        while(fast != nullptr){
            slow = slow->next;
            fast = fast->next;
        }
        cout<<slow->val<<endl;
    }
   
    return 0;
}

小结

快慢指针用法很多 有待总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael 2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值