1. 程式人生 > >演算法:實現連結串列儲存的迴文字串判斷

演算法:實現連結串列儲存的迴文字串判斷

題目:如何判斷一個單鏈表結構的字串是否是迴文字串。例如,“123454321”,返回“yes”;“12345”,返回“false”

可執行程式碼:isPalindrome.cpp

#include<iostream>  
#include<stack> 
#include<stdlib.h>
using namespace std;  
  
typedef struct node{  
    int data;  
    struct node *next;  
}LinkNode, *LinkList;  

class Solution {
	public: 
	void create_list(LinkList *L, int *a, int n) {  
	    int i = 0;  
	    LinkNode *p = NULL;  
	    LinkNode *temp = NULL;  
	    while(i < n) {  
	        p = (LinkNode*)malloc(sizeof(LinkNode));  
	        p->data = a[i];  
	        p->next = NULL;  
	        if(*L == NULL) {  
	            *L = p;  
	        } else {  
	            temp->next = p;  
	        }  
	        temp = p;  
	        i++;  
	    }  
	}  
	// 判斷迴文字串,使用棧實現逆序 
	int isPalindrome(LinkList head) {  
	    int length = 0;  
	    int mid = 0;  
	    int i;  
	    stack<LinkNode*> m_stack;  
	    LinkNode *p = head;  
	    LinkNode *temp = NULL;  
	    int flag = 1;  
	    while(p) {  
	        length++;  
	        p = p->next;  
	    }  
	    if(length %2 == 0) {  
	        mid = length / 2;  
	    } else {  
	        mid = length / 2 + 1;  
	    }  
	    p = head;  
	    i = 1;  
	    while(i <= mid - 1) {  
	        m_stack.push(p);  
	        p = p->next;  
	        i++;  
	    }  
	    if(length % 2 == 0) {  
	        m_stack.push(p);  
	    }  
	    p = p->next;  
	    while(!m_stack.empty() && p) {  
	        temp = m_stack.top();  
	        m_stack.pop();  
	        if(temp->data != p->data) {  
	            flag = 0;  
	            break;  
	        }  
	        p = p->next;  
	    }  
	    return flag;  
	}  
};
  
int main() {  
    int a[] = {1, 2, 3, 4, 5, 4, 3, 2, 1};  
    int n = sizeof(a) / sizeof(int);  
    LinkList head = NULL; 
	Solution S; 
    S.create_list(&head, a, n);  
    if(S.isPalindrome(head)) {  
        cout << "yes" << endl;  
    } else {  
        cout << "no" << endl;  
    }  
    return 0;
}