PTA-链表学习-----奇数值结点链表
生活随笔
收集整理的這篇文章主要介紹了
PTA-链表学习-----奇数值结点链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
奇數值結點鏈表
解法一
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));//為節點分配存儲空間if(q!=NULL){q->data = data;q->next = NULL;}//增加了一個節點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存儲偶數值return head1;//返回奇數值 }此解法是剛學習鏈表時從網上找到的一種解法,具體思路為新建兩個鏈表,然后將L鏈表中的值各自放到對應鏈表中,最后把偶數鏈表的頭節點給(*L)。
此解法需要申請新的內存,若不能及時釋放會造成內存空間的浪費, 所以不能算是最優的算法。
解法二
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鏈表中的奇數節點從鏈表中提出來放入新得奇數鏈表, L存放偶數節點*/ /*p1為計數指針,從L鏈表的頭節點數到尾節點, p2為奇數鏈表計數(定位)指針, prev用于記錄偶數鏈表當前節點*/struct ListNode *p1 = (*L), *head1 = NULL, *p2 = NULL, *prev = NULL;//head1奇數鏈表的頭while(p1) {if(p1->data%2!=0) {if(head1 == NULL) {//只運行一次,放入奇數鏈表的頭節點 head1 = p1;p2 = head1;//定位奇數鏈表 } else {p2->next = p1;//經典---尾添加節點 p2 = p1;}if(prev == NULL) {(*L) = (*L)->next;//也只運行一次,如果L鏈表頭節點為奇數時,L鏈表的頭指向下一個, 如果L鏈表頭節點為偶數節點時,此判斷不會運行 } else {if(p1->next == NULL) {//經典--打斷指針指向 prev->next = NULL;} else {prev->next = p1->next;}}} else { //**********此處由于未將prev作用弄清楚廢了好長時間*********// prev = p1;//(地址:(*L) = p1 = prev.) prev應該定位的是偶數鏈表的當前節點,不應該直接放在外層 }p1 = p1->next;}if(head1!=NULL) {p2->next = NULL;//將奇數鏈表的尾節點的指針置空,沒啥好說的 }return head1; }此解法為學習鏈表一周多后自己的解法,具體解法思路在代碼中,此解法是在沒有借鑒其他解法的情況下自己想出來的,雖然花費了好長時間思考,但著實能夠加強思考問題的邏輯性與考慮的全面性,也同時使我加深和鞏固了鏈表的相關知識,美滋滋。
tips:
1.鏈表中的指針主要是地址之間的指來指去,對鏈表操作時應注意地址指向,像空節點(NULL)在指向下一個節點時會發生越界(段錯誤)。
2.操作鏈表要注意鏈表的頭不能丟,丟了頭就找不到鏈表啦。
3.注意整個過程的邏輯性與思考問題的全面性,問題復雜時建議先在紙上畫個簡單的例子,幫助思考過程中的判斷。
總結
以上是生活随笔為你收集整理的PTA-链表学习-----奇数值结点链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络及网络设备(持续更新)
- 下一篇: 最后一次救赎