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