字符串链表(有头结点)

 

 后面还有两个方法是判断是否为回文串,第一种就是直接放到数组里面,第二种就是通过快慢指针找中间元素,然后将后半部分逆序,然后比较(代码中链表是有头结点的)

还有就是可以使用栈,通过快慢指针找到中间结点,然后将后面的结点放到栈中,然后从栈中弹出元素进行比较。

#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;
}

 有错误的话请提出。

posted @ 2021-04-06 19:07  吃心王  阅读(278)  评论(0)    收藏  举报