输入一个单向链表,输出该链表中倒数第k个结点针

152 阅读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>
#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;
}

小结: 还有点问题