题目描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。 链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针. 要求: (1)正序构建链表; (2)构建后要忘记链表长度。 数据范围:链表长度满足 1 \le n \le 1000 \1≤n≤1000 , k \le n k≤n ,链表中数据满足 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>
#include <malloc.h>
typedef struct Lnode
{
int m_nkey;
Lnode* m_pnext;
}linknode, * linklist;//链表结构
linklist creatlist(int lim)
{
if (lim <= 0 || lim > 1000) return NULL;//判断是否有效
linknode* head = (linklist)malloc(sizeof(linknode));
head->m_nkey = NULL;
head->m_pnext = NULL;//构建头结点
char ch;
linknode* p = NULL,*r;
r = head;
int lim2 = 0;
printf("请输入插入链表的数字串:");
while ((ch = getchar()) != '\n')
{
if (lim2 >= lim) break;
lim2++;
p = (linklist)malloc(sizeof(linknode));
p->m_nkey = (ch - 48);
p->m_pnext = NULL;
r->m_pnext = p;
r = r->m_pnext;
}
return head;
}
int output(linklist l)
{
printf("要输出倒数第几个元素:");
int tmp1 = 0,k = 0;
scanf_s("%d", &tmp1);
if (tmp1 < 0) return false;
linknode* p, * r;
p = l;
for (r = l; r->m_pnext != NULL;r = r->m_pnext)
{
k++;
if (k >= tmp1)
{
p = p->m_pnext;
}
}
return p->m_nkey;
}
int main(void)
{
int lim1 = 0;
printf("请输入链表结点个数");
scanf_s("%d", &lim1);
linklist l = creatlist(lim1);
int out = output(l);
printf("结果为:%d", out);
return 0;
}
小结: 还有点问题