设单链表的表头指针为L,结点由data,next构成,设计算法判断该链表的全部n个字符是否中心对称。如xyx、xyyx
总结
算法思想:
使用栈来判断链表中的数据是否对称。先让前一半元素依次进栈。在处理链表的后一半元素时,当访问到链表的一个元素后,就从链表中弹出一个元素。按循环后数组下标来判断,是否对称
代码编写注意点:
1、数组下标从0开始,前一半元素下标是从0 <= i < n/2
2、判断元素个数为奇数 n%2==1
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include <iostream> using namespace std;
typedef struct LNode { char data; struct LNode* next; }LNode, * LinkList;
int dc(LinkList L,int n){ int i; char s[n/2]; LNode *p=L->next; for(i=0;i<n/2;i++){ s[i]=p->data; p=p->next; } i--; if(n%2==1) p=p->next; while(p!=NULL&&s[i]==p->data){ i--; p=p->next; } if(i==-1) return 1; else return 0;
}
bool dc(LinkList L, int n) { char* a = new char[n]; int i = 0, j = n - 1; LNode* p = L->next; int k=0; while (p != NULL) { a[k] = p->data; p = p->next; k++; } while (j - i > 0) { if (a[i] == a[j]) { i++; j--; } else { cout << "错误"; return false; } } delete[] a; return true; }
int main() { LinkList L; L = new LNode; L->next = NULL; int n = 3; LNode* a, * b, * c; a = new LNode; b = new LNode; c = new LNode; a->data = 'x'; b->data = 'y'; c->data = 'y'; L->next=a; a->next=b; b->next=c; c->next = NULL; cout << dc(L, n) << endl; delete L; delete a; delete b; delete c; system("pause"); return 0; }
|