中心對稱鏈表

文章目錄

  • 1 題目
  • 2 思路
    • 2.1 思路一
    • 2.2 思路二
    • 2.3 考點
    • 2.4 擴展
  • 3 實現
    • 3.1 思路1
    • 3.2 思路2
    • 3.3 完整例子

1 題目

已知長度為n(n>1)的單鏈表,表頭指針為L,結點結構由data和next兩個域構成,其中data域為字符型,設計一個在時間和空間兩方面都盡可能高效的算法,判斷該單鏈表是否中心對稱(例如xyx,xxyyxx都是中心對稱)。

2 思路

2.1 思路一

把單鏈表的后半段依此存入棧中,然后遍歷單鏈表的前半段,每遍歷一個元素,就從棧中彈出一個元素,進行比較,如果值不相等,則該鏈表為非對稱鏈表,否則,當棧為空時,則該鏈表為對稱鏈表。

例1: 對于單鏈表”xyzzyx”,把后半段yxx依次存入棧中,棧中為xyz,依次遍歷單鏈表的前半段xyz,遍歷x時,比較棧頂元素x;遍歷y時,比較棧頂元素y;遍歷z時,比較棧頂元素z,直到棧空,然后該鏈表為對稱鏈表。

例1: 對于單鏈表”xyzwqyx”,把后半段yxx依次存入棧中,棧中為xyz,依次遍歷單鏈表的前半段xyz,遍歷x時,比較棧頂元素z;遍歷y時,比較棧頂元素y;遍歷z時,比較棧頂元素q,值不相等,然后該鏈表為非對稱鏈表。

2.2 思路二

把單鏈表的后半段原地逆置,然后使用雙指針p、q依次遍歷單鏈表的前半段和后半段,若相等,則將p、q指向下一個元素,當q指向空指針時,該鏈表為對稱鏈表;否則該鏈表為非對稱鏈表。

2.3 考點

棧、頭插法

2.4 擴展

思考:當鏈表長度未知時,該怎么求?

  • 1,思路一:遍歷單鏈表得到長度,按照原方法。
  • 2,思路二:把單鏈表依次存入棧和入隊列,然后依次出棧和出隊列,比較元素。

3 實現

3.1 思路1

int judge1(LinkList L, int n){LNode* stack = new LNode[n/2];int index = -1;LNode *q = L->next, *p = L->next;for(int i = 1;i < (n+1)/2 + 1;i++){//偶數找對半下一個(4+1)/2+1 = 3//奇數找對半下兩個 (5+1)/2+ 1 = 4q = q->next;}while(q != nullptr){stack[++index] = *q;q = q->next;}//打印棧中的數據
//    while(index != -1){
//        printf("%c ",stack[index--].data);
//    }while(index != -1){if(p->data != stack[index--].data)return 0;p = p->next;    }return 1;
}

時間復雜度:O(n)
空間復雜度:O(n)

3.2 思路2

int judge2(LinkList L, int n){LNode *p = L->next, *q = L->next, *r;for(int i = 1;i < (n+1)/2;i++){q = q->next;}p = q->next;q->next = nullptr;while(p != nullptr){r = p->next;p->next = q->next;q->next = p;p = r;}//printLNode(L); //測試打印棧p = L->next;q = q->next;while(q != nullptr){if(p->data != q->data){return 0;}p = p->next;q = q->next;}return 1;}

時間復雜度:O(n)
空間復雜度:O(1)

3.3 完整例子

#include<iostream>typedef struct LNode{char data;struct LNode *next;
}LNode,*LinkList;//尾插法創建鏈表
LinkList createList(LinkList &L,int n){//L = (LinkList)malloc(sizeof(LNode));L = new LNode;LNode *s, *r= L;char x[n + 1];scanf("%s", x);int index = 0;while(n--){s = new LNode;s->data = x[index++];r->next = s;r = s;}r->next = nullptr;return L;
}//打印鏈表
void printLNode(LNode* L){LNode* p = L->next;while(p != nullptr){printf("%c ", p->data);p = p->next;}printf("\n");
}int judge1(LinkList L, int n){LNode* stack = new LNode[n/2];int index = -1;LNode *q = L->next, *p = L->next;for(int i = 1;i < (n+1)/2 + 1;i++){//偶數找對半下一個(4+1)/2+1 = 3//奇數找對半下兩個 (5+1)/2+ 1 = 4q = q->next;}while(q != nullptr){//棧中存儲數據stack[++index] = *q;q = q->next;}//打印棧中的數據
//    while(index != -1){
//        printf("%c ",stack[index--].data);
//    }while(index != -1){if(p->data != stack[index--].data)return 0;p = p->next;    }return 1;
}int judge2(LinkList L, int n){LNode *p = L->next, *q = L->next, *r;for(int i = 1;i < (n+1)/2;i++){//遍歷到后半段的前一個結點q = q->next;}p = q->next;//存儲后半段的頭指針的下一個結點(以防斷鏈)q->next = nullptr;//(后半段的頭指針下一個元素置空)while(p != nullptr){//使用頭插法原地逆置r = p->next;//防止斷鏈p->next = q->next;q->next = p;p = r;}//printLNode(L); //測試打印棧p = L->next;q = q->next;while(q != nullptr){if(p->data != q->data){return 0;}p = p->next;q = q->next;}return 1;}int main(){int n;scanf("%d", &n);//單鏈表長度(即字符串長度 )LNode* L = new LNode[n];createList(L, n);printLNode(L);if(judge1(L, n) == 1) printf("對稱鏈表");else printf("非對稱鏈表");delete[] L;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36029.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36029.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36029.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux RPM包安裝、卸載和升級(rpm命令)詳解

(轉載請刪除括號里的內容) 下面講解一下&#xff0c;如何使用 rpm 命令對 RPM 二進制包進行安裝、卸載和升級操作。我們以安裝 apache 程序為例。 RPM包默認安裝路徑 通常情況下&#xff0c;RPM 包采用系統默認的安裝路徑&#xff0c;所有安裝文件會按照類別分散安裝到下表所…

優漫動游 大廠需要什么樣的ui設計師呢?

通常來說大公司UI設計的流程主要是這樣的&#xff1a;創意-頭腦風暴-策劃方案-交互設計&評審-美術設計&評審-開發實施&#xff0c;不過實際上大多數公司都有自己的一套流程&#xff0c;源于公司的基因、公司組織體系、公司領導風格。一起了解大廠需要什么樣的ui設計師呢…

谷粒商城第十一天-品牌管理中關聯分類

目錄 一、總述 二、前端部分 1. 調整查詢調用 2. 關聯分類 三、后端部分 四、總結 一、總述 之前是在商品的分類管理中直接使用的若依的逆向代碼 有下面的幾個問題&#xff1a; 1. 表格上面的參數填寫之后&#xff0c;都是按照完全匹配進行搜索&#xff0c;沒有模糊匹配…

nodejs實現前后端websocket通信+心跳示例

nodejs后端代碼 server.js //需要安裝ws模塊 npm install ws const WebSocket require("ws") const port 8085const ws new WebSocket.Server({port})ws.on("connection", (socket) > {socket.on("message",(message) > {const da…

自定義hook之首頁數據請求動作封裝 hooks

本例子實現了自定義hook之首頁數據請求動作封裝 hooks&#xff0c;具體代碼如下 export type OrganData {dis: Array<{ disease: string; id: number }>;is_delete: number;name: string;organ_id: number;parent_id: number;sort: number; }; export type SwiperData …

【STM32】簡介

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介紹&#xff1a;"謓澤"正在路上朝著"攻城獅"方向"前進四" &#x1f50e;&#x1f3c5; 榮譽&#xff1a;2021|2022年度博客之星物聯網與嵌入式開發TOP5|TOP4、2021|2022博客之星T…

(2)linux虛擬機配置中文輸入法和如何下載軟件

&#xff08;一&#xff09;配置中文輸入法&#xff1a; 1、sudo apt-get install fcitx&#xff0c;安裝fcitx框架&#xff0c;安裝完成之后&#xff0c;選擇該框架 2、接下來輸入sudo apt-get install fcitx fcitx-googlepinyin&#xff0c;安裝谷歌輸入法之后&#xff0c;重…

WebSocket與消息推送

B/S結構的軟件項目中有時客戶端需要實時的獲得服務器消息&#xff0c;但默認HTTP協議只支持請求響應模式&#xff0c;這樣做可以簡化Web服務器&#xff0c;減少服務器的負擔&#xff0c;加快響應速度&#xff0c;因為服務器不需要與客戶端長時間建立一個通信鏈接&#xff0c;但…

Windows - UWP - 網絡不好的情況下安裝(微軟商店)MicrosoftStore的應用

Windows - UWP - 網絡不好的情況下安裝&#xff08;微軟商店&#xff09;MicrosoftStore的應用 前言 UWP雖然幾乎被微軟拋棄了&#xff0c;但不得不否認UWP應用給用戶帶來的體驗。沙箱的運行方式加上微軟的審核&#xff0c;用戶使用起來非常放心&#xff0c;并且完美契合Wind…

聚類與回歸

聚類 聚類屬于非監督式學習&#xff08;無監督學習&#xff09;&#xff0c;往往不知道因變量。 通過觀察學習&#xff0c;將數據分割成多個簇。 回歸 回歸屬于監督式學習&#xff08;有監督學習&#xff09;&#xff0c;知道因變量。 通過有標簽樣本的學習分類器 聚類和…

前端實現文件預覽功能

前端實現文件預覽功能 ? 需求&#xff1a;實現一個在線預覽pdf、excel、word、圖片等文件的功能。 介紹&#xff1a;支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代碼實現所有功能&#xff0c;建議以下的預覽文件標簽可以在外層包裹一層彈窗。 ? 圖片預覽 iframe標簽…

前端雜項-個人總結八股文的背誦方案

個人總結八股文的背誦方案 URL到顯示網頁的過程 瀏覽器解析URL&#xff0c;獲取協議&#xff0c;主機名&#xff0c;端口號&#xff0c;路徑等信息&#xff0c;并通過DNS查詢將主機名轉換為對應的IP地址瀏覽器與服務器建立TCP&#xff0c;進行三次握手。瀏覽器向服務器發送HT…

枚舉緩存工具

此文章為筆記&#xff0c;為閱讀其他文章的感受、補充、記錄、練習、匯總&#xff0c;非原創&#xff0c;感謝每個知識分享者。 文章目錄 1. 背景2. 枚舉緩存3. 樣例展示4. 性能對比5. 總結 本文通過幾種樣例展示如何高效優雅的使用java枚舉消除冗余代碼。 1. 背景 枚舉在系統…

不需要用@Param注解與需要用@Param注解的情況

不需要用Param注解&#xff1a; 1.只有一個參數時&#xff0c;不需要用Param注解。此時在不使用Parma注解的情況下&#xff0c;sql語句中的參數占位符名稱直接使用任何名稱均可&#xff1b; 2.方法參數是引用數據類型的情況下&#xff0c;不需要用Param注解。 需要用Param注…

QT生成Word PDF文檔

需求&#xff1a;將軟件處理的結果保存為一個報告文檔&#xff0c;文檔中包含表格、圖片、文字&#xff0c;格式為word的.doc和.pdf。生成word是為了便于用戶編輯。 開發環境&#xff1a;qt4.8.4vs2010 在qt的官網上對于pdf的操作介紹如下&#xff1a;http://qt-project.org/…

華為認證 | H3C廠商證書,含金量有多高?

華為H3C認證是中國第一家建立國際規范的完整的網絡技術認證體系&#xff0c;它的作用是不言而喻的&#xff0c;工作上它能給你帶來技能加分。 那么H3C認證網絡工程師證書含金量怎么樣呢&#xff1f;下面我們就來了解一下吧。 01 H3C認證網絡工程師證書含金量 全面覆蓋H3C相關…

微服務Eureka注冊中心

目錄 一、Eureka的結構和作用 二、搭建eureka-server 三、服務注冊 四、服務發現 假如我們的服務提供者user-service部署了多個實例&#xff0c;如圖&#xff1a; 存在的問題&#xff1a; order-service在發起遠程調用的時候&#xff0c;該如何得知user-service實例的ip地址…

深度學習快速入門系列---損失函數

在深度學習中&#xff0c;損失函數的作用是量化預測值和真實值之間的差異&#xff0c;使得網絡模型可以朝著真實值的方向預測&#xff0c;損失函數通過衡量模型預測結果與真實標簽之間的差異&#xff0c;反映模型的性能。同時損失函數作為一個可優化的目標函數&#xff0c;通過…

10個微服務設計模式

微服務設計模式是一種指導微服務架構設計和開發的一系列原則和實踐。微服務設計模式的目的是為了解決微服務架構中遇到的一些常見的問題和挑戰&#xff0c;比如服務劃分、服務通信、服務治理、服務測試等。微服務設計模式可以幫助我們構建出高效、可靠、可擴展、可維護的微服務…

九耶丨閣瑞鈦倫特-井字棋html5代碼

你想了解關于井字棋&#xff08;Tic-Tac-Toe&#xff09;的HTML代碼嗎&#xff1f;以下是一個簡單的井子棋的HTML代碼示例&#xff1a; <!DOCTYPE html> <html> <head><title>Tic-Tac-Toe</title><style>.board {display: flex;flex-wrap…