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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构1800题 (陈守孔) 第2章】线性表 算法设计题全解

發布時間:2024/8/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构1800题 (陈守孔) 第2章】线性表 算法设计题全解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【2.5】

【題目大意】去掉鏈表中絕對值重復過的數字(只保留第一個)

【解法】刪除的時候用當前枚舉到的節點的前一個節點,這樣的話能夠方便刪除。用數組來判重。

【代碼】

int flag[10000+10]; void quchong(LNode *L){LNode *p = L;while (p->next!=NULL){int t = p->next->data;if (t<0) t = -t;if (flag[t]==0){flag[t] = 1;p = p->next;}else{LNode *temp = p->next;p->next = temp->next;free(temp);}} }

  

【2.6】

【題目大意】讓你把兩個有序鏈表合并成一個有序鏈表

【做法】就按照歸并排序的思路合并就ojbk了,合并的時候把合并后的結果接在第一個鏈表的頭結點后面就好!

【代碼】

//合并之后,放到第一個鏈表里面 void _merge(LNode *h1,LNode *h2){LNode *p1 = h1->next;LNode *p2 = h2->next,*t;h1->next = NULL;t = h1;while (p1!=NULL && p2!=NULL){if (p1->data<p2->data){t->next = p1;t = p1;p1 = p1->next;}else{t->next = p2;t = p2;p2 = p2->next;}}while (p1!=NULL) {t->next = p1;t = p1;p1=p1->next;}while (p2!=NULL){t->next = p2;t = p2;p2 = p2->next;} }

  

【2.7】

【題目大意】一個升序一個逆序的鏈表,讓你合并成一個有序的單鏈表。

【做法】把逆序的那個原地倒置就好

//先把第二個鏈表原地倒置 然后當成2.6的合并做就好 void _merge(LNode *h1,LNode *h2){LNode *p = h2->next;h2->next = NULL;while (p){LNode * temp = p->next;p->next = h2->next;h2->next = p;p = temp;}LNode *p1 = h1->next;LNode *p2 = h2->next,*t;h1->next = NULL;t = h1;while (p1!=NULL && p2!=NULL){if (p1->data<p2->data){t->next = p1;t = p1;p1 = p1->next;}else{t->next = p2;t = p2;p2 = p2->next;}}while (p1!=NULL) {t->next = p1;t = p1;p1=p1->next;}while (p2!=NULL){t->next = p2;t = p2;p2 = p2->next;} }

  

【2.8】同【2.6】代碼

?

【2.9】

【題目大意】

無頭結點的單鏈表兩個
兩個都是有序的
讓你把這兩個單鏈表合并成一個鏈表。
要求不能破壞第二個鏈表的結構

【做法】

在做歸并的時候,如果第一個等于第二個,那么就跳過第二個鏈表遍歷到的元素,這樣第一個鏈表上有的元素,第二個鏈表里對應的就不會管他了。

無頭結點不好直接在h1的基礎上添加新的元素,所以自己另外創建一個無頭結點的鏈表.一個一個累加上去就好。

【代碼】

//這里必須要用二重指針,因為我們要改變第一個鏈表的指向(我們新創的一個鏈表) //main函數里調用_merge(&h1,h2)即可(h2不用變) void _merge(LNode **h1,LNode *h2){LNode *p1 = *h1;LNode *p2 = h2,*h3;h3 = newnode();//不好直接接在第一個鏈表上,所以新創建一個LNode *t = newnode();t = h3;while (p1!=NULL && p2!=NULL){if (p1->data<p2->data){LNode *temp = newnode(); //不能破壞原始鏈表,所以只能自己創了temp->data = p1->data;t->next = temp;t = temp;p1 = p1->next;}else if (p1->data>p2->data){LNode *temp = newnode();temp->data = p2->data;t->next = temp;t = temp;p2 = p2->next;}else if (p1->data==p2->data){//如果兩個鏈表中有,那么只要第一個鏈表中的p2 = p2->next;}}if (p1==NULL) p1 = p2; //這樣寫比較簡潔while (p1!=NULL) {LNode *temp = newnode();temp->data = p1->data;t->next = temp;t = temp;p1=p1->next;}*h1 = h3->next;//讓h1再指向h3 }

  

【2.10】和【2.9的代碼一樣】只不過變成帶頭結點的了。遍歷到兩個鏈表的p和q的時候,如果p->data==q->data,則跳過其中一個就好了。

因為是集合,所以只會重復一次。

【2.11】

【題目大意】

求兩個集合的交集(在兩個鏈表里遞增排列),

【做法】

也沒說帶不帶頭結點。。。就當做是有頭結點吧。放在A鏈表中,這個簡單,重構下A鏈表就好。

在歸并的時候,如果p和q節點的節點值相同,就加到A鏈表的后面就好

【代碼】

void _merge(LNode *h1,LNode *h2){LNode *p1 = h1->next;LNode *p2 = h2->next,*t;h1->next = NULL;t = h1;while (p1!=NULL && p2!=NULL){if (p1->data<p2->data){p1 = p1->next;}else if (p1->data>p2->data){p2 = p2->next;}else if (p1->data==p2->data){//如果兩個鏈表中有,任取一個放在newA鏈表后面t->next = p1;t = p1;p1 = p1->next;}} }

  

【2.12】和【2.11】一樣的。

【2.13】也一樣。。

【2.14】

題目大意:給你三個遞增鏈表A,B,C讓你求A∪(B∩C),時間復雜度要求為O(|A|+|B|+|C|)

?

總結

以上是生活随笔為你收集整理的【数据结构1800题 (陈守孔) 第2章】线性表 算法设计题全解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。