习题11-7 奇数值结点链表 (20分)
生活随笔
收集整理的這篇文章主要介紹了
习题11-7 奇数值结点链表 (20分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網上很多答案都是新建兩個鏈表分別存放奇數和偶數,我的思路是在原有鏈表里進行刪除操作,同時將奇數結點放入新的鏈表中。也有同學有一樣的思路,但是具體代碼實現方式不一樣,我在這里分享一下我的想法,給各位同學提供一個思路。。。
代碼如下
struct ListNode *getodd(struct ListNode **L) {struct ListNode *p = NULL, *q = NULL,*newLast = NULL,*newHead=NULL;//p為快指針,q為慢指針for (q, p = *L; p; q = p, p = p->next){if (p->data % 2 == 1)//判斷當前結點是否為奇數{struct ListNode *r=(struct ListNode *)malloc(sizeof(struct ListNode));//新malloc一個空間放臨時數據r->data=p->data;r->next =NULL;if (q)//若q不為NULL,則p不是第一個節點,反之p為第一個節點,見else{q->next = p->next;//原鏈表中刪除p這一結點(因為還要繼續往下走所以不能free(p))if(q->data%2==1){//這里如果原鏈表的鏈表頭下移之后如果還是奇數結點的話繼續下移*L=q->next;}p=q;//這里在刪除完p之后(因為沒有free(p),所以內存中p還是存在的),要讓p=q,即下一次循環從q開始(此時q->next已經跳過p),跳過已被刪除的p結點newLast=newHead;if(newLast){//將該結點加在新鏈表的最后while(newLast->next){newLast=newLast->next;}newLast->next=r;}else{//這里是如果原鏈表第一個奇數結點不是鏈表頭的話,能正確給新鏈表的鏈表頭賦值newHead=r;}}else//若p為第一個結點且該結點處data為奇數時,新的鏈表頭就是r(r->data為p->data,但是r->next為NULL),此時原鏈表的鏈表頭向下移{newHead=r;*L = p->next;}}}return newHead; }編譯通過,所有測試點通過,應該沒什么問題了吧。
畢竟我也是剛開始學,可能有的地方考慮的不對,不過這已經是我能寫出來的最好的答案了(破涕為笑)
歡迎大家來討論(捂臉)
總結
以上是生活随笔為你收集整理的习题11-7 奇数值结点链表 (20分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cesium实现图片与文字合成新图标
- 下一篇: 【PTA】6-4 奇数值结点链表