C-数据结构之单链表实现回文串的判断

学习笔记–11.23
刚接触数据结构,实现方法简单,文中注释均为我在写代码中遇到的问题和调试过程。且在回文串判断的时候开始选择用快慢指针进行(但是由于此处思路不是很清晰,每次都会少计算一个位置导致换了一种方法)-方法简单但是时间复杂度就比较高;
后续我会再学习一下快慢指针的方法。

//数据结构之回文串的判断
//存储方式,单链表
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	char c;
	struct node* next;
}Lnode,*Linklist; 
//创建 (尾插法)
Linklist creat()
{
	Linklist L,q;
	Lnode* s;
	L=(Linklist)malloc(sizeof(Lnode));
	L->next=NULL;
	q=L;
	char e;
	printf("请输入想要创建的元素(空格分隔,输入q则结束):");
	while(1)
	{
		
		scanf("%c",&e);
		if(e!='q')
		{
			s=(Linklist)malloc(sizeof(Lnode));
			s->next=q->next;
			q->next=s;
			s->c=e;
			q=s;
		}
		else
		break;
	}
	return L;
}
int length(Linklist L)
{
	int count=0;
	while(L!=NULL)
	{
		L=L->next;
		count++;
	}
//	printf("这个链表的长度为:%d",count-1);
	return count-1;
}
Linklist huiwen(Linklist L)
{//使用快慢两个指针进行操作,快指针走两边,慢指针走一步 快指针走到终点,正好慢指针走到中点,然后逆序后半段链表。
	int i,sum;
	sum=length(L);//得到单链表的长度 
	Linklist s;//申明一个s结点 
	Linklist q;
	int flag=1; 
	q=L;
	s=L->next;//s指向L的位置 
	int a=sum;
	int j;
	for(j=1;j<=(a/2);j++)
	{
		for(i=0;i<sum;i++)
		{
		L=L->next;// 找到最后一个结点
		} 
		if(s->c==L->c)
		{
		s=s->next;
		sum--;
		}
		else{
			flag=0;
		}
		L=q;
		
	}
	if(flag==1)
	{
	printf("\n该串是回文串\n");	
	}
	else
	{
		printf("该串不是回文串\n");
	}
	return q;
//	Linklist fast;
//	Linklist slow;
//	Linklist q;
//	Linklist prev=NULL;
//	Lnode* s;
//	fast=L;
//	slow=L;
//	q=L;		

//	while(fast!=NULL&&fast->next!=NULL) 
//	{
//		s=(Linklist)malloc(sizeof(Lnode));
//		fast=fast->next->next;
//		printf("1.fast=%c\n",fast->c);
//		printf("1.slow=%c\n",slow->c);
//		s=slow->next;//记录slow的下一个位置 
//		printf("2.s=%c\n",s->c);
//		slow->next=prev;//插入到头 
//		printf("3.slow=%c\n",slow->c);
//		prev=slow;// prev移动到头部 
//		printf("4.prev=%c\n",prev->c);
//		slow=s;//slow回到正确位置 
//		printf("5.slow=%c\n",slow->c);
		
//	}
//	if(fast!=NULL)
//	{
//		slow=slow->next;
//	}
//	while(slow!=NULL)
//	{
//		if(slow->c!=prev->c)
//		{
//		 printf("该串不是回文串\n");
//		 break;
//	    }
//	slow=slow->next;
//	printf("3.%c",slow->c);
//	prev=prev->next;
//	printf("3.%c",prev->c);
//    }
//	return q;		
	}

	 
 void print(Linklist L)
 {
 	L=L->next;
 	printf("\n该字符串为:");
 	while(L!=NULL)
 	{
 		printf("%c",L->c);
 		L=L->next;
	 }
 }
int main(){
	Linklist L;
	L=creat();
	print(L);
	huiwen(L);
	print(L);
	
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜杜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值