前言
大家好!我是一个自学测试的本科生Test_晓
这篇是我在面试过程中遇到的一道有关循环链表的编程题,可供大家学习参考
同时,如果大家有新的思路也可以和我一起探讨呀~大家一起进步
题目
给定一个大小为N的循环链表,从1-N-1排列,如果按每隔X位插入1个数(N+X*Y),则插入的第Y个数其前后节点的数字分别是什么?
题目理解
无论x等于几,第一个数都插在链表的第一个数的后面,再每隔x个数插入第二个数
思路
设置有两个指针,起初第一个指针pre指向第一个结点,第二个指针指向pre的下一个结点,第一个指针完成一次插入后往后移动(x+2),p指针再指向pre的下一个结点,当第N次插入时的pre->data是N前一个结点的值,p->data是N后一个结点的值
代码
链表结构体
typedef struct LNode {
int data;
struct LNode *next; //指向下一个节点
}LinkNode;
初始化链表
void InitList(LinkNode *&L) {
L = (LinkNode *)malloc(sizeof(LinkNode)); //分配链表空间
L->next = NULL; //初始化头指针指向NULL
}
创建链表
//使用尾插法创建链表
void CreateListR(LinkNode *&L,int a[],int n) {
//s为每次插入的新节点,r是尾节点
LinkNode *s,*r;
L = (LinkNode *)malloc(sizeof(LinkNode));
r = L;
for(int i =0;i<n;i++) {
s = (LinkNode *)malloc(sizeof(LinkNode)); //为每个新节点分配空间
s->data = a[i]; //新节点赋值
//插入新节点
r->next = s;
r = s;
}
//特别注意:为了后续的操作,尾指针的next指向首节点,而不是头节点
r->next = L->next;
}
实现题目要求的函数
void fun (LinkNode *&L,int x,int y,int N) {
//pre初始化指向 首节点,p始终指向pre的下一个节点,s为插入的新节点
LinkNode *pre = L->next,*p = pre->next,*s;
//j在新节点data赋值时使用
int j=1;
//y用来计数插入的节点
while(y>0) {
//特别注意:插入的不是第一个节点时,pre和p都要向后移动两个节点
if(j!=1){
for(int i=0;i<x+2;i++) {
pre=pre->next;
}
p=pre->next;
}
s = (LinkNode *)malloc(sizeof(LinkNode));
//新节点插入
s->data = N+x*j;
s->next = p;
pre->next = s;
j++;
y--;
}
printf("该节点前一个节点的值%d\n",pre->data);
printf("该节点后一个节点的值%d\n",p->data);
}
整体代码
#include<stdio.h>
#include<malloc.h>
typedef struct LNode {
int data;
struct LNode *next;
}LinkNode;
void InitList(LinkNode *&L) {
L = (LinkNode *)malloc(sizeof(LinkNode));
L->next = NULL;
}
void CreateListR(LinkNode *&L,int a[],int n) {
LinkNode *s,*r;
L = (LinkNode *)malloc(sizeof(LinkNode));
r = L;
for(int i =0;i<n;i++) {
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = a[i];
r->next = s;
r = s;
}
r->next = L->next;
}
void fun (LinkNode *&L,int x,int y,int N) {
LinkNode *pre = L->next,*p = pre->next,*s;
int j=1;
while(y>0) {
if(j!=1){
for(int i=0;i<x+2;i++) {
pre=pre->next;
}
p=pre->next;
}
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = N+x*j;
s->next = p;
pre->next = s;
j++;
y--;
}
printf("该节点前一个节点的值%d\n",pre->data);
printf("该节点后一个节点的值%d\n",p->data);
}
int main() {
LinkNode *L;
InitList(L);
int y,x,N;
printf("请输入N的值:");
scanf("%d",&N);
printf("请输入x的值:");
scanf("%d",&x);
printf("请输入y的值:");
scanf("%d",&y);
int a[N];
for(int i=0;i<N;i++) {
a[i] = i+1;
}
CreateListR(L,a,N);
fun(L,x,y,N);
return 0;
}