LeetCode 328. Odd Even Linked List
2016-03-10 20:08
281 查看
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.
You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.
Example:
Given
return
Note:
The relative order inside both the even and odd groups should remain as it was in the input.
The first node is considered odd, the second node even and so on ...
一、算法分析
设置两个尾指针,分别指向odd链表和even链表尾节点;从第三个开始遍历链表,根据flag判断是偶数节点还是奇数节点,然后分别添加到偶链表和奇链表尾部。
二、C语言实现
You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.
Example:
Given
1->2->3->4->5->NULL,
return
1->3->5->2->4->NULL.
Note:
The relative order inside both the even and odd groups should remain as it was in the input.
The first node is considered odd, the second node even and so on ...
一、算法分析
设置两个尾指针,分别指向odd链表和even链表尾节点;从第三个开始遍历链表,根据flag判断是偶数节点还是奇数节点,然后分别添加到偶链表和奇链表尾部。
二、C语言实现
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* oddEvenList(struct ListNode* head) { struct ListNode *p,*rear1,*rear2,*temp; int flag=-1; if(head==NULL || head->next==NULL || head->next->next==NULL){ return head; } rear1=head; rear2=head->next; p=rear2->next; while(p){ temp=p->next; if(flag==-1){//表示是odd,加入到第一个链表尾部 p->next=rear1->next; rear1->next=p; rear1=p; p=temp; flag*=-1; }else{ p->next=rear2->next; rear2->next=p; rear2=p; p=temp; flag*=-1; } } rear2->next=NULL; return head; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解