HJ51 输出单向链表中倒数第k个结点

54 阅读2分钟

题目描述

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

链表结点定义如下:

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

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

要求: 1.正序构建链表 2.构建后要忘记链表长度

数据范围:链表长度满足1≤n≤1000,k≤n,链表中数据满足0≤val≤10000 

本题有多组样例输入。

输入描述

输入链表结点个数

输入链表的值

输入k的值

输出描述:

输出一个整数

示例

输入:
8
1 2 3 4 5 6 7 8
4
输出:
5

思路

快慢双指针法:两个指针都在表头结点,快指针先走k步,走不到k说明链表不够长,fast==null,输出0。快指针走k步后,两个指针再同时向后走,直到fast==null时(while),slow指针所指的值为k对应的值。

  • 定义链表结点。(记得初始化)

  • 输入n,创建空的头结点,并保存。

  • 输入val,并建立链表,用for循环将val一个一个存入链表中,正序建立链表。

  • 输入k,定义快慢指针,找到slow对应的值,并输出。

具体实现

#include<iostream>
using namespace std;
struct ListNode{ //链表结点定义
    int val;
    ListNode* next;
    ListNode():val(0),next(nullptr){} //初始化
    ListNode(int x):val(x),next(nullptr){}
};
int main(){
    int n,k,val;
    while(cin>>n){
        ListNode* head = new ListNode(); //创建空的,头结点
        ListNode* cur = head; //保存头结点
        for(int i=0; i<n; i++){ //正序建立链表
            cin>>val;
            ListNode* temp = new ListNode(val);
            head->next = temp;
            head = head->next;
        }
        cin>>k;
        ListNode *fast = cur,*slow = cur; //定义快慢指针,并放在头结点处
        for(int i=0; i<k;i++){
            fast = fast->next;
        }
        while(fast!=NULL){
            slow = slow->next;
            fast = fast->next;
        }
        cout<<slow->val;
    }
}

时间复杂度

  • 时间复杂度:O(n),共遍历n个链表元素。

  • 空间复杂度:O(1)。

小结

  • 若想表示空指针,建议用nullptr,而不是NULL。

  • 链表结点定义写法。(还有初始化!)

  • 创建链表并赋值写法。

  • 若相隔k个距离可建议用快慢指针法。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情