题解 | # 输出单向链表中倒数第k个结点#

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

http://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d

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

描述

输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
  int  m_nKey;
  ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针。
示例:
输入:
8
1 2 3 4 5 6 7 8
4
输出:5

方法一

思路分析

本题最直接的办法就是根据输入的数组直接输出倒数第k个数,不过本题题目要求使用单向链表,因此直接构造单向链表,然后顺序输出倒数第k个结点,输出时采用输出第n-k个结点。

核心代码

#include <bits/stdc++.h>
using namespace std;
struct Node{
	int value;
	struct Node* next;
    Node(int value)
    {
        this->value=value;
    }
};
int main(){
    int count=0;
    while(cin>>count)
    {
        Node *root = new Node(-1);
	    Node *p = root;
        for (int i=0; i < count; ++i)//顺序构造链表
        {
            int num;
            cin>>num;
            Node *p = new Node(num);//下一个结点
		    p->next = NULL;
		    root->next = p;// 连接 当前节点 与 下一个结点
		    root = root->next;
	     }
	    root->next = NULL;//最后一个节点指向mull
        int k=0;
        cin>>k;
        if(k<=0||k>count)
        {
            cout<<0<<endl;
            continue;
        }
        for(int i=0;i<count-k+1;i++)//顺序找到第count-k个
        {
            p=p->next;
        }
	    cout<<p->value<<endl;
    }

	
}
复杂度分析
  • 时间复杂度:时间花费在链表的构造和查找中,构造链表的时间复杂度为$O(n)$,查找的时间复杂度为$O(n)$,因此总的时间复杂度为$O(n)$
  • 空间复杂度:构造链表需要的空间为正常使用,因此总的空间复杂度为$O(1)$

方法二

思路分析

根据方法一,我们可以设置一个数组存储输入的元素,然后根据数组元素从后往前构造链表,从而顺序输出链表第k个结点

核心代码

#include <bits/stdc++.h>
using namespace std;
struct Node{
	int value;
	struct Node* next;
    Node(int value)
    {
        this->value=value;
    }
};
vector<int>arr;
int main(){
    int count=0;
    while(cin>>count)
    {
        int index=count;
        arr={};
        while(index--)
        {
            int num;
            cin>>num;
            arr.push_back(num);
        }
        Node *root = new Node(-1);
	    Node *p = root;
        for (int i=count-1;i>=0; i--)//按照数组倒序构造链表
        {
            Node *p = new Node(arr[i]);//下一个结点
		    p->next = NULL;
		    root->next = p;// 连接 当前节点 与 下一个结点
		    root = root->next;
	     }
	    root->next = NULL;//最后一个节点指向mull
        int k=0;
        cin>>k;
        if(k<=0||k>count)
        {
            cout<<0<<endl;
            continue;
        }
        for(int i=0;i<k;i++)//顺序找到第k个
        {
            p=p->next;
        }
	    cout<<p->value<<endl;
    }

	
}

复杂度分析

  • 时间复杂度:时间花费在链表的构造和查找中,构造链表的时间复杂度为$O(n)$,查找的时间复杂度为$O(n)$,因此总的时间复杂度为$O(n)$
  • 空间复杂度:需要额外设置一个数组存储输入的元素,因此总的空间复杂度为$O(max(n))$


方法三

思路分析

在构建链表时,可以通过首插法构造链表,然后顺序输出第k个结点

图解


核心代码

#include <bits/stdc++.h>
using namespace std;
struct Node{
	int value;
	struct Node* next;
    Node(int value)
    {
        this->value=value;
    }
};
vector<int>arr;
int main(){
    int count=0;
    while(cin>>count)
    {
        Node *root = new Node(-1);
        root->next=NULL;
        for (int i=0;i<count; i++)//按照首插法构造链表
        {
            int num=0;
            cin>>num;
            Node *p = new Node(num);//下一个结点
		    p->next = root;//插入到根节点之前
		    root= p;// 根节点向前移动一个位置
	     }
        int k=0;
        cin>>k;
        if(k<=0||k>count)
        {
            cout<<0<<endl;
            continue;
        }
        for(int i=0;i<k-1;i++)//从前往后顺序找到第k个
        {
            root=root->next;
        }
	    cout<<root->value<<endl;
    }

	
}
复杂度分析
  • 时间复杂度:时间花费在链表的构造和查找中,构造链表的时间复杂度为$O(n)$,查找的时间复杂度为$O(n)$,因此总的时间复杂度为$O(nm)$
  • 空间复杂度:除构造链表之外,不需要额外的存储空间,因此空间复杂度为$O(1)$



全部评论

相关推荐

暴杀流调参工作者:春招又试了一些岗位,现在投递很有意思,不仅要精心准备简历,投递官网还得把自己写的东西一条一条复制上去,阿里更是各个bu都有自己的官网,重复操作无数次,投完简历卡完学历了,又该写性格测评、能力测评,写完了又要写专业笔试,最近还有些公司搞了AI辅助编程笔试,有些还有AI面试,对着机器人话也听不明白录屏硬说,终于到了人工面试又要一二三四面,小组成员面主管面部门主管面hr面,次次都没出错机会,稍有不慎就是挂。 卡学历卡项目卡论文卡实习什么都卡,没有不卡的😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4018次浏览 46人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16907次浏览 137人参与
# 巨人网络春招 #
11527次浏览 224人参与
# 春招至今,你的战绩如何? #
15816次浏览 145人参与
# 你的实习产出是真实的还是包装的? #
3098次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1553次浏览 41人参与
# 米连集团26产品管培生项目 #
7311次浏览 226人参与
# HR最不可信的一句话是__ #
1091次浏览 32人参与
# AI面会问哪些问题? #
946次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1247次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2853次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152905次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8021次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32148次浏览 361人参与
# 简历中的项目经历要怎么写? #
311051次浏览 4265人参与
# 投格力的你,拿到offer了吗? #
178339次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76981次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187605次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64760次浏览 890人参与
# 如果重来一次你还会读研吗 #
230018次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364353次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务