题目连接:
链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com)
题目描述:
描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足0≤n≤10^5,节点中的值都满足 0≤val≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
题目解法:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/*
*BM14 链表的奇偶重排
描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足 0^50≤n≤10^5 ,节点中的值都满足 0≤val≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
*/
struct ListNode {
int val;
struct ListNode *next;
};
//创建奇偶两条链表的虚拟头节点,根据当前节点的奇偶来放到对应奇偶链表中,当放完后,再将偶链表的放到奇链表后,输出
struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
struct ListNode* dummyHeadOdd = (struct ListNode*)malloc(sizeof(struct ListNode)); //奇数虚拟头节点
struct ListNode* dummyHeadEven = (struct ListNode*)malloc(sizeof(struct ListNode)); //偶数虚拟头节点
struct ListNode *tmp, *tmpOdd, *tmpEven;
tmp = head, tmpOdd = dummyHeadOdd, tmpEven = dummyHeadEven; //设置head和奇偶链表的当前位置指针
int count = 0;
while(tmp){
count++;
if(count%2){ //奇数,将head当前节点放到奇链表中
tmpOdd->next = tmp;
tmpOdd = tmpOdd->next;
}else{ //偶数,将head当前节点放到偶链表中
tmpEven->next = tmp;
tmpEven = tmpEven->next;
}
tmp = tmp->next;
}
tmpEven->next = NULL; //退出循环后,设置偶链表的下一位为空,防止嵌套
tmpOdd->next = dummyHeadEven->next; //将偶链表的放到奇链表后
return dummyHeadOdd->next;
}
void buildList(struct ListNode* head, int * input, int n){
for(int i=0; i<n; i++){
head->next = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = input[i];
head = head->next;
head->next = NULL;
head->val = 0;
}
}
/**************************end******************************************/
int main ()
{
int input1[]={1,2,3,4,5,6};
struct ListNode LNa, LNb;
buildList(&LNa, input1, sizeof(input1)/sizeof(int));
struct ListNode* ret = oddEvenList(&LNa);
printf("\r\nret:");
while(ret){
printf("%d->", ret->val);
ret = ret->next;
}
return 0;
}