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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PTA-链表学习-----奇数值结点链表

發(fā)布時(shí)間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PTA-链表学习-----奇数值结点链表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

奇數(shù)值結(jié)點(diǎn)鏈表

解法一

struct ListNode *readlist() {struct ListNode *head = NULL, *p;int data=0;while(scanf("%d", &data)&&data != -1){struct ListNode *q = (struct ListNode *)malloc(sizeof(struct ListNode));//為節(jié)點(diǎn)分配存儲(chǔ)空間if(q!=NULL){q->data = data;q->next = NULL;}//增加了一個(gè)節(jié)點(diǎn)else exit(1);//異常退出if(head != NULL){p->next = q;}else head = q;p = q;}return head; } struct ListNode *getodd( struct ListNode **L ) {struct ListNode *head0 = NULL, *head1 = NULL, *p0, *p1;while((*L) != NULL){int data = (*L)->data;struct ListNode *q = (struct ListNode *)malloc(sizeof(struct ListNode));if(data%2){if(q != NULL){q->data = data;q->next = NULL;}else exit(1);if(head1 != NULL){p1->next = q;}else head1 = q;p1 = q;}else{if(q != NULL){q->data = data;q->next = NULL;}else exit(1);if(head0 != NULL){p0->next = q;}else head0 = q;p0 = q;}(*L) = (*L)->next;}*L = head0;//L存儲(chǔ)偶數(shù)值return head1;//返回奇數(shù)值 }

此解法是剛學(xué)習(xí)鏈表時(shí)從網(wǎng)上找到的一種解法,具體思路為新建兩個(gè)鏈表,然后將L鏈表中的值各自放到對(duì)應(yīng)鏈表中,最后把偶數(shù)鏈表的頭節(jié)點(diǎn)給(*L)。
此解法需要申請(qǐng)新的內(nèi)存,若不能及時(shí)釋放會(huì)造成內(nèi)存空間的浪費(fèi), 所以不能算是最優(yōu)的算法。

解法二

struct ListNode *readlist() {//尾插struct ListNode *head = NULL, *tail = NULL;int a;scanf("%d", &a);while(a!=-1) {struct ListNode *newNode = (struct ListNode*)malloc(sizeof(struct ListNode));newNode->data = a;newNode->next = NULL;if(head == NULL) {tail = head = newNode;} else {tail->next = newNode;tail = newNode;}scanf("%d", &a);}tail->next = NULL;return head; } struct ListNode *getodd(struct ListNode **L) {/*解題思路, 將L鏈表中的奇數(shù)節(jié)點(diǎn)從鏈表中提出來(lái)放入新得奇數(shù)鏈表, L存放偶數(shù)節(jié)點(diǎn)*/ /*p1為計(jì)數(shù)指針,從L鏈表的頭節(jié)點(diǎn)數(shù)到尾節(jié)點(diǎn), p2為奇數(shù)鏈表計(jì)數(shù)(定位)指針, prev用于記錄偶數(shù)鏈表當(dāng)前節(jié)點(diǎn)*/struct ListNode *p1 = (*L), *head1 = NULL, *p2 = NULL, *prev = NULL;//head1奇數(shù)鏈表的頭while(p1) {if(p1->data%2!=0) {if(head1 == NULL) {//只運(yùn)行一次,放入奇數(shù)鏈表的頭節(jié)點(diǎn) head1 = p1;p2 = head1;//定位奇數(shù)鏈表 } else {p2->next = p1;//經(jīng)典---尾添加節(jié)點(diǎn) p2 = p1;}if(prev == NULL) {(*L) = (*L)->next;//也只運(yùn)行一次,如果L鏈表頭節(jié)點(diǎn)為奇數(shù)時(shí),L鏈表的頭指向下一個(gè), 如果L鏈表頭節(jié)點(diǎn)為偶數(shù)節(jié)點(diǎn)時(shí),此判斷不會(huì)運(yùn)行 } else {if(p1->next == NULL) {//經(jīng)典--打斷指針指向 prev->next = NULL;} else {prev->next = p1->next;}}} else { //**********此處由于未將prev作用弄清楚廢了好長(zhǎng)時(shí)間*********// prev = p1;//(地址:(*L) = p1 = prev.) prev應(yīng)該定位的是偶數(shù)鏈表的當(dāng)前節(jié)點(diǎn),不應(yīng)該直接放在外層 }p1 = p1->next;}if(head1!=NULL) {p2->next = NULL;//將奇數(shù)鏈表的尾節(jié)點(diǎn)的指針置空,沒啥好說(shuō)的 }return head1; }

此解法為學(xué)習(xí)鏈表一周多后自己的解法,具體解法思路在代碼中,此解法是在沒有借鑒其他解法的情況下自己想出來(lái)的,雖然花費(fèi)了好長(zhǎng)時(shí)間思考,但著實(shí)能夠加強(qiáng)思考問題的邏輯性與考慮的全面性,也同時(shí)使我加深和鞏固了鏈表的相關(guān)知識(shí),美滋滋。

tips:

1.鏈表中的指針主要是地址之間的指來(lái)指去,對(duì)鏈表操作時(shí)應(yīng)注意地址指向,像空節(jié)點(diǎn)(NULL)在指向下一個(gè)節(jié)點(diǎn)時(shí)會(huì)發(fā)生越界(段錯(cuò)誤)。
2.操作鏈表要注意鏈表的頭不能丟,丟了頭就找不到鏈表啦。
3.注意整個(gè)過程的邏輯性與思考問題的全面性,問題復(fù)雜時(shí)建議先在紙上畫個(gè)簡(jiǎn)單的例子,幫助思考過程中的判斷。

總結(jié)

以上是生活随笔為你收集整理的PTA-链表学习-----奇数值结点链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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