题解 | # 输出单向链表中倒数第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)$



全部评论

相关推荐

02-25 19:38
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3136次浏览 43人参与
# HR最不可信的一句话是__ #
1021次浏览 32人参与
# 米连集团26产品管培生项目 #
7075次浏览 224人参与
# 春招至今,你的战绩如何? #
14766次浏览 137人参与
# AI面会问哪些问题? #
893次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2704次浏览 52人参与
# MiniMax求职进展汇总 #
24897次浏览 321人参与
# 沪漂/北漂你觉得哪个更苦? #
1235次浏览 38人参与
# 你做过最难的笔试是哪家公司 #
1131次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2684次浏览 49人参与
# XX请雇我工作 #
51147次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7966次浏览 43人参与
# 简历第一个项目做什么 #
32073次浏览 357人参与
# 简历中的项目经历要怎么写? #
310908次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152832次浏览 889人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187556次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64539次浏览 864人参与
# 如果重来一次你还会读研吗 #
229974次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178254次浏览 891人参与
# 你怎么看待AI面试 #
180654次浏览 1296人参与
# 正在春招的你,也参与了去年秋招吗? #
364172次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160822次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务