日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)

發(fā)布時間:2024/7/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

回文串為首尾對稱的字符串:

如a,aba,abba等

單鏈表思路

1.將字符讀入鏈表

2.找到鏈表中點

3.將鏈表從中點斷開成2條,將后半條反轉(zhuǎn)

4.比較兩條鏈表是否相等(比較次數(shù)以少的為準(zhǔn)(長度為奇數(shù)時))

雙向鏈表思路

1.將字符讀入鏈表

2.找到鏈表尾節(jié)點

3.從首尾依次向中間比較

(雙向鏈表可以雙向移動,代碼上更簡潔,見下面)

?

單鏈表C++代碼實現(xiàn)

// // Created by mingm on 2019/3/13. // #include <iostream> #include <math.h> using namespace std; struct Node //節(jié)點 {char data;Node* next;Node():next(NULL){}Node(char &ch):data(ch),next(NULL){}~Node(){} }; class SLinkedList //鏈表 {Node* p_head; public:SLinkedList() //構(gòu)造函數(shù){p_head = new Node; //帶頭鏈表 // cout << "new 1" << endl;}~SLinkedList(){ erase(); } //析構(gòu)函數(shù)void erase(){Node *del_tempNode, *tempNode;del_tempNode = p_head;while(del_tempNode != NULL) {tempNode = del_tempNode -> next;delete del_tempNode; // cout << "delete 1" << endl;del_tempNode = tempNode;}}void set_head(Node* p){p_head = p;}Node* get_head(){return p_head;}size_t get_len() //求鏈表長度{size_t len = 0;Node* p = p_head;while(p){len++;p = p->next;}return len;}void delHeadSentinel() //刪除鏈表表頭哨兵{Node* del = p_head;p_head = p_head->next;delete del; //刪除鏈表的表頭哨兵 // cout << "delete head 1" << endl;}Node* reverse() //鏈表反轉(zhuǎn){if(p_head == NULL || p_head->next == NULL)return NULL;else{Node *prevNode, *nextNode, *tempNode;prevNode = p_head;nextNode = prevNode->next;prevNode->next = NULL;while(nextNode != NULL){tempNode = nextNode->next;nextNode->next = prevNode;prevNode = nextNode;nextNode = tempNode;}p_head = prevNode;return p_head;}}Node* findMiddle() //查找鏈表中點{size_t len = get_len();Node* tempNode = p_head;size_t n = ceil(double(len)/2);for(size_t i = 1; i < n; ++i){tempNode = tempNode->next;}return tempNode;} };int main() {while(true){cout << "-----------------------------------" << endl;char ch;cin.clear();cout << "enter a word, is it a palindrome ?" << endl;if((ch = cin.get()) && ch == '\n'){cout << "empty word !" << endl;continue;}SLinkedList charList, backHalfOfList; //鏈表(前半部分鏈表),后半部分鏈表Node* tempNode = charList.get_head();while(ch != '\n') //把單詞存進(jìn)鏈表charList{Node* newNode = new Node(ch); // cout << "new insert 1" << endl;tempNode->next = newNode;tempNode = newNode;ch = cin.get();}charList.delHeadSentinel(); //鏈表表頭刪除backHalfOfList.delHeadSentinel(); //把空表頭哨兵節(jié)點刪除Node* endOfFrontList = charList.findMiddle(); //鏈表的中點是前一半的結(jié)束節(jié)點Node* backListHead = endOfFrontList->next; //中點的下一個節(jié)點是后半部分的開始endOfFrontList->next = NULL; //把前半部分鏈表斷開backHalfOfList.set_head(backListHead); //把后半部分的鏈表表頭地址設(shè)置好backHalfOfList.reverse(); //后半部分鏈表反轉(zhuǎn)size_t n = backHalfOfList.get_len(); //求后半部分鏈表長度Node *frontList = charList.get_head(); //找到前半部分的開頭Node *backList = backHalfOfList.get_head(); //后半部分的開頭(反轉(zhuǎn)后的)bool answer = false;if(backList == NULL) //如果后半部分為空,說明只有一個字符answer = true;else{for(size_t i = 0; i < n; ++i) //比較數(shù)據(jù)是否相同{if(frontList->data != backList->data){answer = false;break;}else{answer = true;frontList = frontList->next;backList = backList->next;}}}if(answer)cout << "the word is a palindrome." << endl;elsecout << "the word is not a palindrome." << endl;char conti;cout << "continue to check? (y/n)" << endl;cin >> conti;cin.get();if(conti == 'y' || conti == 'Y'){continue;}elsebreak;}return 0; }

Valgrind檢查結(jié)果

雙向鏈表C++代碼實現(xiàn)

// // Created by mingm on 2019/3/16. // #include <iostream> #include <math.h> using namespace std; struct Node //節(jié)點 {char data;Node *prev, *next;Node():prev(NULL),next(NULL){}Node(char &ch):data(ch),prev(NULL),next(NULL){}~Node(){} }; class SLinkedList //鏈表 {Node* p_head; public:SLinkedList() //構(gòu)造函數(shù){p_head = new Node; //帶頭鏈表 // cout << "new 1" << endl;}~SLinkedList(){ erase(); } //析構(gòu)函數(shù)void erase(){Node *del_tempNode, *tempNode;del_tempNode = p_head;while(del_tempNode != NULL) {tempNode = del_tempNode -> next;delete del_tempNode; // cout << "delete 1" << endl;del_tempNode = tempNode;}}void set_head(Node* p){p_head = p;}Node* get_head(){return p_head;}Node* get_tail() //求鏈表尾節(jié)點{Node* p = p_head;if(p_head == NULL)return NULL;while(p->next){p = p->next;}return p;}void delHeadSentinel() //刪除鏈表表頭哨兵{Node* del = p_head;p_head = p_head->next;p_head->prev = NULL;delete del; //刪除鏈表的表頭哨兵 // cout << "delete head 1" << endl;} };int main() {while(true){cout << "-----------------------------------" << endl;char ch;cin.clear();cout << "enter a word, is it a palindrome ?" << endl;if((ch = cin.get()) && ch == '\n'){cout << "empty word !" << endl;continue;}SLinkedList charList; //鏈表Node* tempNode = charList.get_head();while(ch != '\n') //把單詞存進(jìn)鏈表charList{Node* newNode = new Node(ch); // cout << "new insert 1" << endl;tempNode->next = newNode; //前面節(jié)點后指針指向后面newNode->prev = tempNode; //后面節(jié)點前置指針指向前面tempNode = newNode;ch = cin.get();}charList.delHeadSentinel(); //鏈表空表頭刪除Node *front = charList.get_head(); //定義一個從頭開始的指針Node *back = charList.get_tail(); //定義一個從尾部開始的指針bool answer = false;if(front == back) //說明只有一個字符answer = true;else{while(front != back) //比較數(shù)據(jù)是否相同{if(front->data != back->data){answer = false;break;}else{answer = true;front = front->next;back = back->prev;}}}if(answer)cout << "the word is a palindrome." << endl;elsecout << "the word is not a palindrome." << endl;char conti;cout << "continue to check? (y/n)" << endl;cin >> conti;cin.get();if(conti == 'y' || conti == 'Y'){continue;}elsebreak;}return 0; }

Valgrind檢查結(jié)果?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。