方法一:头插法建立链表,然后顺序遍历链表,找到第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;
}