设单链表的表头指针为L,结点结构由data和next两个域构成,其中data为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。
算法思想:将链表前半部分存入栈中,然后依次出栈和链表后半部分比较。如果长度为奇数时跳过中间元素,与后半段比较。
注意一个点,while(p),p是遍历指针,代码段总是报空指针异常,我就很纳闷,为什么最后一个结点的next,能进入循环。
查看结构体发现,next指针并未初始化为NULL,实际指向内存随机一块空间,如果构建单链表的时候不把表尾指向NULL,就会导致next进入循环。
#include<iostream>
#include<stack>
using namespace std;
//判断链表字符是否中心对称
//算法思想:将链表前半部分存入栈中,然后依次出栈和链表后半部分比较。
typedef struct LNode {//本名
char data; //数据域
struct LNode* next; //指针域
}LNode, * LinkList;//别名,LinkList代表表头
LinkList List_tailInsert(LinkList& L) {
LNode* s; LNode* r; char x;int length = 0;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
r = L;
cout << "输入链表长度" << endl;
cin >> length;
cout << "输入元素" << endl;
while (length)
{
cin >> x;
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
length--;
}
r->next = NULL;
return L;
}
void show(LinkList L) {
LNode* p = L->next;
while (p) {
cout << p->data;
p = p->next;
}
cout << endl;
}
bool judegement(LinkList L, int n) {
stack<char> s;
LNode* p = L->next;
for (int i = 0; i < n / 2; i++) {
s.push(p->data);
p = p->next;
}
if (n % 2 == 1)p = p->next;
while(p) {
if (p->data == s.top()) {
s.pop();
p = p->next;
}
else {
return false;
}
}
return true;
}
int main() {
LinkList l;
List_tailInsert(l);
show(l);
cout << judegement(l,5) << endl;
}