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

145 阅读1分钟

题目描述

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

链表结点定义如下:

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

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

要求:

(1)正序构建链表;

(2)构建后要忘记链表长度。

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

本题有多组样例输入。

题目来源

题目来源

输入描述

输入说明

1 输入链表结点个数

2 输入链表的值

3 输入k的值

输出描述:

输出一个整数

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

具体实现


#include <stdio.h>

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

int main(){
    struct ListNode *head = NULL, *tmp, *p;
    int num;
    int m_nKey;
    int i = 0;
    int k;
    while(scanf("%d", &num) != EOF){
        for(i = 0; i  < num; i++){
            p = (struct ListNode *)malloc(sizeof(struct ListNode));
            scanf("%d", &m_nKey);
            p->m_nKey = m_nKey;
            p->m_pNext = NULL;
            if(head == NULL)
                head = p;
            else
                tmp->m_pNext = p;
            tmp = p;
        }
        tmp = head;
        scanf("%d", &k);
        for(i = 0; i < num-k;i++){
            tmp = tmp->m_pNext;
        }
        printf("%d", tmp->m_nKey);
        while(head != NULL){
            tmp = head;
            head = tmp->m_pNext;
            free(tmp);
        }
        printf("\n");
    }
    return 0;
}