字符类型的单链表对称性判断

设单链表的表头指针为L,节点由data和next两个域构成,其中data为字符类型,设计算法判断该链表全部字符是否对称。

例如:xyx,xyyx

#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
typedef struct LNode{ 
	char data;
	struct LNode *next;
}LNode,*LinkList;//创建链表结构体
LinkList List_HeadInsert(LinkList &L,int n){ //头插法创建链表
	LNode *s;char x;
	L=(LinkList)malloc(sizeof(LNode));//创建头节点
	L->next=NULL;
	L->data='0';//初始化头节点
	
	int i=0;
	while(i<n){
		cin>>x;
		s=(LNode*)malloc(sizeof(LNode));//创建节点
		s->data=x;//将x的值赋给节点
		s->next=L->next;
		L->next=s;//插入到链表头部
		i++;
	}
	return L;
}
void dc(LinkList L,int n){//判断是否为对称序列
	int i;
	char s[n/2];
	LNode *p;
	p=L->next;//指向第一个数据节点
	for(i=0;i<n/2;i++){//获取链表后半部分的字符,一分为二并存入数组
		s[i]=p->data;
		p=p->next;
	}
	i--;
	if(n%2==1){//如果为奇序列,p指向中间节点的下一个节点
		p=p->next;
	}
	while(i>=0&&p->data==s[i]){//序列两部分如果对称继续循环
		i--;
		p=p->next;
	}
	if(p==NULL){//如果链表遍历完毕则是对称,反之
		cout<<"对称";
	}
	else cout<<"不对称";
}

int main(){
	LNode *L;
	int n;
	cin>>n;
	List_HeadInsert(L,n);//调用函数创建列表
	dc(L,n);//调用函数判断是否对称
	cout<<endl;
}

运行结果如下:
孟小起

该方法借助了数组,当然也可以借助链表,只要将数据链表的前半部分按头插法插入就可以了。

时间复杂性O(n).

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值