输出单链表倒数第K个结点值

方法一:头插法建立链表,然后顺序遍历链表,找到第K个节点即可。

方法二:尾插法建立链表,先搜索距离第一个数据节点K个位置的节点,即用指针pcur指向第m+1个数据节点,然后用pnode指向第1个节点,两指针相距K个节点。每次移动两个指针,当pcur指向空节点时,pnode指向距离空节点K个位置的节点,即单链表倒数第K个结点。

方法一代码段如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
	ElemType data;
	struct LinkNode* next;
}LinkNode,*LinkList;
void creatLinkList(LinkList& L) {
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->next = NULL;
	int num;
	while (scanf("%d", &num) && num != -1) {
		LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
		pnode->data = num;
		pnode->next = L->next;
		L->next = pnode;
	}
}
void printLinkList(LinkList L) {
	LinkNode* pnode = L->next;
	while (pnode != NULL) {
		printf("%d ", pnode->data);
		pnode = pnode->next;
	}
}
void searchLinkList(LinkList L, int k) {
	LinkNode* pnode = L->next;
	int cnt = 0;
	while (pnode != NULL) {
		cnt += 1;
		if (cnt == k) {
			printf("%d", pnode->data);
		}
		pnode = pnode->next;
	}
}
int main() {
	LinkList L = NULL;
	int k;
	scanf("%d", &k);
	creatLinkList(L);
	searchLinkList(L, k);
	//printLinkList(L);
	return 0;
}

方法二代码段如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
	ElemType data;
	LinkNode* next;
}LinkNode, * LinkList;
void creatLinklist(LinkList& L) {
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->next = NULL;
	LinkNode* ptail = L;
	int num;
	while (scanf("%d", &num) && num < 99999) {
		LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
		pnode->data = num;
		pnode->next = ptail->next;
		ptail->next = pnode;
		ptail = pnode;
	}
}
void printLinklist(LinkList L) {
	LinkNode* pnode = L->next;
	while (pnode != NULL) {
		printf("%d ", pnode->data);
		pnode = pnode->next;
	}
}
void searchLinklist(LinkList L, int m) {
	LinkNode* pnode = L->next;
	LinkNode* pcur = L->next;
	int ith = 0;
	while (pcur != NULL) {
		ith += 1;
		if (ith == m) {
			break;
		}
		pcur = pcur->next;
	}
	pcur = pcur->next;
	while (pcur != NULL) {
		pnode = pnode->next;
		pcur = pcur->next;
	}
	printf("%d", pnode->data);
}
int main() {
	LinkList L = NULL;
	creatLinklist(L);
	int m;
	scanf("%d", &m);
	searchLinklist(L, m);
	//printLinklist(L);
	return 0;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值