循环链表面试题(附C语言实现)

7 篇文章 0 订阅
2 篇文章 0 订阅

前言

大家好!我是一个自学测试的本科生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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值