Day02

题目描述

输入一个单向链表,输出该链表中倒数第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 
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>data;
                ListNode *q = new ListNode(data);
                p->next = q;
                p = p->next;
        }
         int kth = 0;
        cin>>kth;
        if(kth == 0) cout << 0<next, *slow = pHead->next;

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

小结

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

你可能感兴趣的:(复试,链表,c++)