字符串链表(有头结点)
后面还有两个方法是判断是否为回文串,第一种就是直接放到数组里面,第二种就是通过快慢指针找中间元素,然后将后半部分逆序,然后比较(代码中链表是有头结点的)
还有就是可以使用栈,通过快慢指针找到中间结点,然后将后面的结点放到栈中,然后从栈中弹出元素进行比较。
#include <stdio.h> #include <stdlib.h> typedef struct StrNode *PStrNode; struct StrNode{ char c; PStrNode next; }; typedef struct StrNode *LinkString; LinkString createNullStr_link(void); LinkString insertOneChar(LinkString s,char c); LinkString subStr_link(LinkString s,int i,int j); void printStr_link(LinkString s); int lengthString(LinkString s); int isPalindrome(LinkString s); int isPalindromeGood(LinkString s); int main(void){ LinkString s = createNullStr_link(); s = insertOneChar(s,'1'); s = insertOneChar(s,'2'); s = insertOneChar(s,'3'); s = insertOneChar(s,'4'); s = insertOneChar(s,'4'); s = insertOneChar(s,'3'); s = insertOneChar(s,'2'); s = insertOneChar(s,'1'); printStr_link(s); printf("%d",isPalindromeGood(s)); } LinkString createNullStr_link(void){//带有头结点的 LinkString stringLink = (LinkString)malloc(sizeof(struct StrNode)); if(!stringLink){ printf("内存分配失败!"); return NULL; }else{ stringLink->next = NULL; return stringLink; } } LinkString insertOneChar(LinkString s,char c){ if(!s){ return NULL; } PStrNode newNode = (PStrNode)malloc(sizeof(struct StrNode)); if(newNode == NULL){ return NULL; }else{ newNode->c = c; newNode->next = s->next; s->next = newNode; } return s; } void printStr_link(LinkString s){ if(s == NULL){ puts(" "); return ; } PStrNode cur = s->next; while(cur != NULL){ printf("%c",cur->c); cur = cur->next; } printf("--->尾\n"); } int lengthString(LinkString s){ int length = 0; PStrNode cur = s->next; while(cur != NULL){ length++; cur = cur->next; } return length; } LinkString subStr_link(LinkString s,int i,int j){ //从i处开始取,取j个字符(如果j不满足,不采取少取,直接报错) if(i<0 || i>lengthString(s) || j>lengthString(s) || i+j+1 >= lengthString(s)){ return NULL; }else{ LinkString newString = createNullStr_link(); LinkString newStringCur = newString; PStrNode cur = s->next; for(int m=0; m<i; m++){ cur = cur->next; } for(int n=0; n<j; n++){ PStrNode newNode = (PStrNode)malloc(sizeof(struct StrNode)); newStringCur->next = newNode; newNode->c = cur->c; newNode->next = NULL; cur = cur->next; newStringCur = newNode; } return newString; } } int isPalindrome(LinkString s){ char strs[lengthString(s)]; LinkString newLinkString = s->next; for(int i=0; i<lengthString(s); i++){ strs[i] = newLinkString->c; newLinkString = newLinkString->next; } // for(int i=0; i<lengthString(s); i++){ // printf("%c ",strs[i]); // } for(int j=0; j<=lengthString(s)/2; j++){ if(strs[j] != strs[lengthString(s)-1-j]){ return 0; } } return 1; } int isPalindromeGood(LinkString head){ // printf("\n%c\n",head->c); if(head->next == NULL){ return 0; } if(head->next->next == NULL){ return 1; } LinkString fast = head->next->next; LinkString slow = head->next; while(fast != NULL && fast->next != NULL){ slow = slow->next; fast = fast->next->next; } LinkString n = slow->next; LinkString m = slow->next->next; slow->next = NULL; while(m != NULL){ n->next = slow; slow = n; n = m; m = m->next; } n->next = slow; slow = head->next; // printf("\n----%c\n",slow->c); while(n != NULL && slow != NULL){ if(n->c != slow->c){ return 0; } n = n->next; slow = slow->next; } return 1; }
有错误的话请提出。

浙公网安备 33010602011771号