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

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

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

双指针法

#include <iostream>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
    //三种不同参数的构造函数
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x):val(x), next(nullptr){};    
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

int nodeVal(ListNode*, int);   //函数提前声明一下
int main(){
    int cnt_node;   //链表节点个数
    int val;   //链表节点值
    int k;   
    while(cin >> cnt_node){
        ListNode* head = new ListNode(-1);   //链表的头结点
        ListNode* p = head;    //工作指针
        //创建单链表     !!!!!!!!!!!!!!!!!
        for(int i = 1; i <= cnt_node; i++){   
            cin >> val;
            ListNode* tmp = new ListNode(val);
            tmp->next = nullptr;
            p->next = tmp;
            p = tmp;
        }
        cin >> k; 
        int res = 0;
        if(k >= 1)
            res = nodeVal(head->next, k);//因为创建的是带头节点的单链表(head没有实际意义),
                                         //所以传入的参数是head->next, 而不是head
        cout << res <<endl;
    }
    return 0;
}

//查找链表的倒数第k个节点
int nodeVal(ListNode* head, int k){
    ListNode* fast = head;
    ListNode* slow = head;
    for(int i = 0; i < k; i++){   //fast先到达第k个节点
        fast = fast->next;
    }
    while(fast != nullptr ){   //使slow最终到达倒数第k个节点
        fast = fast->next;    //注意fast与slow的顺序
        slow = slow->next;
    }
    return slow->val;
}
全部评论

相关推荐

09-13 10:30
门头沟学院 Java
点赞 评论 收藏
分享
08-08 16:33
唐山学院 Java
职场水母:首先,简历太长,对于实习和应届找工作,hr一眼扫的是学历,技术看实习,你写的技术栈字太多了,尽量用一句话概括不用写那么详细,技术面的时候会问的,而且技术栈都会在实习或者项目里体现,你要做的是,把你的简历浓缩为一页,删除没用的东西,比如实践经历,自我评价,这些纯废话,没用,专业技能写的太离谱,你真的熟练掌握了吗,建议都写熟悉,找工作和写论文不一样,追求的是干练和实用,把实习经历和项目提前,把掌握的技术栈写到最后,然后去找实习,
点赞 评论 收藏
分享
08-15 01:16
Python
Java小萌新新萌小...:照片不用整这么大的 而且你的照片截歪了 你想找专业对口的 那普通话证写在这里其实没有什么必要 就是看着内容多点 而且里面字体大小也不一样 修改一下排版 有很多空间可以再利用一下 字大一点 不然现在这样观感不太好 再就是项目好好优化一下 加油
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务