设单链表的表头指针为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).