PTA.奇数值结点链表

PTA.奇数值结点链表,第1张

老样子,自觉代码比网上其它的大部分人高效且简单易懂,故在此分享。

题干:

裁判程序:

样例:

先说思路吧,我想的是把原链表分为奇数链表和偶数链表,但不去开辟空间(malloc),这样就可以达到节省时间和空间的目的。

参考代码:

struct ListNode *readlist()//这里是一个尾插法创建链表,如果这里您不理解,
{                          //那么本文内容可能不适合您继续阅读。

struct ListNode *head = NULL, *tail = NULL; do{ struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode)); p->next = NULL; scanf("%d", &p->data); if((p->data)!=-1) { if(head) { tail->next = p; tail = p; }else{ head = tail = p; } }else break; } while (1); return head; } struct ListNode *getodd( struct ListNode **L ) { struct ListNode *oddhead = NULL, *oddtail = NULL; //oddhead和oddtail分别代表奇数链表的头结点和尾结点 struct ListNode *temp = *L, *tail=NULL; //temp用于原链表遍历,tail代表偶数链表的尾结点 *L=NULL;//此函数结束后,L将代表偶数链表的头结点 //由于L的数据已经被temp继承,所以这里的修改并没有什么问题 int judge = 1;//judge用于判断temp遍历的结点的数据是否是链表之中的第一个偶数 //1为是,找到第一个偶数后改为0且不再变动以防止误判 while(temp) { if((temp->data)%2)//判断数据奇偶性 { //数据对2取余后,值只能为1或0,值为1时进if分支,值为0时进else分支 if(oddhead) { oddtail->next = temp; oddtail = temp; }else{ oddhead = oddtail = temp; } }else{ if(judge) { (*L) = tail = temp; judge = 0; }else{ tail->next = temp; tail = temp; } } //以上,用尾插法分别创建了两个链表,if分支为奇数,else为偶数 temp = temp->next;//temp后移进行遍历 } if(oddtail)//若尾结点不为空则给奇数链表封尾 oddtail->next = NULL; if(tail)//若尾结点不为空则给偶数链表封尾 tail->next = NULL; return oddhead; }

如果您还有更优解法,欢迎在评论区留言,本人很乐于学习您的思想。

当然,如果您有疑问,也可以在评论区留言,我经常逛这个社区且很乐于解答。

最后,如果您对以上内容满意,不妨点个免费的👍支持我,咱们下个文章见!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/674621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存