给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足
,节点中的值都满足 
要求:空间复杂度
,时间复杂度
{1,2,3,4,5,6}{1,3,5,2,4,6}
1->2->3->4->5->6->NULL重排后为1->3->5->2->4->6->NULL
{1,4,6,3,7}{1,6,7,4,3}
1->4->6->3->7->NULL重排后为1->6->7->4->3->NULL
奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3
链表长度不大于200000。每个数范围均在int内。
struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
if(head == NULL || head -> next == NULL) return head;
struct ListNode *p_odd, *p_even, *p_even_start;
p_odd = head;
p_even = head -> next;
p_even_start = head -> next;
// 分别构建奇链表和偶链表
while(p_even && p_even -> next){
p_odd -> next = p_odd -> next -> next;
p_odd = p_odd -> next;
p_even -> next = p_even -> next -> next;
p_even = p_even -> next;
}
// 将奇链表的最后一个节点指向偶链表
p_odd -> next = p_even_start;
return head;
} struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
if (head == NULL || head->next == NULL){
return head;
}
struct ListNode* pOdd = head;
struct ListNode* pEven = head->next;
struct ListNode* p = pEven;//保存偶数的第一个指针
while(pOdd!=NULL && pEven!=NULL && pOdd->next!=NULL && pEven->next!=NULL)
{
pOdd->next = pEven->next;
pOdd = pOdd->next;
pEven->next = pOdd->next;
pEven = pEven->next;
}
pOdd->next = p;//连接奇偶
return head;
} struct ListNode* oddEvenList(struct ListNode* head ) {
struct ListNode *p;
int *buffer[2],i,ListLen;
if(head==NULL || head->next==NULL || head->next->next==NULL)
return head;
for(p=head,ListLen=0; p!=NULL; ListLen++,p=p->next)
;
buffer[0] = (int*)malloc((ListLen+1)/2*sizeof(int));
buffer[1] = (int*)malloc(ListLen/2*sizeof(int));
for(p=head,i=0; p!=NULL; i++,p=p->next)
buffer[i%2][i/2] = p->val;
for(p=head,i=0; i<(ListLen+1)/2; i++,p=p->next)
p->val = buffer[0][i];
for(i=0; i<ListLen/2; i++,p=p->next)
p->val = buffer[1][i];
return head;
} struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
if(!head || !head->next || !head->next->next)
{
return head;
}
struct ListNode* s = head;
struct ListNode* d = head->next;
struct ListNode* dhead = d;
while (s && d) {
s->next=d->next;
if(!s->next)
{
break;
}
s=s->next;
d->next=s->next;
d=d->next;
}
s->next = dhead;
return head;
} #include <stdio.h>
struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
if (head == NULL || head->next == NULL || head->next->next == NULL) {
return head;
}
struct ListNode* a = head; //奇数节点
struct ListNode* b = head->next; //偶数节点
struct ListNode* h2 = b; //第二个节点,备用,最后一个奇数节点指向此
while (b->next->next != NULL && a->next->next != NULL) {
a->next = a->next->next;
b->next = b->next->next;
a = a->next;
b = b->next;
}
//总节点个数为奇数是要加一个,a再移动一次
if (a->next->next!=NULL && b->next->next==NULL) {
a->next = b->next;
a = a->next;
b->next = NULL;
}else {
a->next = NULL;
}
//将备用的h2付给a->next
a->next = h2;
return head;
} struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
int s[100000] = {0};
int i = 0;
int j;
struct ListNode *p = head;
//如果head为空,直接返回
if (head == NULL) return head;
//先将奇数号节点的val赋给s
while (p) {
s[i++] = p->val;
p = p->next;
if (p) {
p = p->next;
}
}
//将偶数号节点的val赋给s
//p先指向第一个偶数节点
p = head->next;
while (p) {
s[i++] = p->val; //i在原有基础上赋值
p = p->next;
if (p) {
p = p->next;
}
}
//将s中的值一一重新赋给head
p = head;
i = 0;
while (p) {
p->val = s[i++];
p = p->next;
}
return head;
} struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
int size1=0,size2=0;
struct ListNode*p=head;
int A[100005];
int B[100005];
int i=0;
while(p){
if(i%2==0){
A[size1++]=p->val;
}
else{
B[size2++]=p->val;
}
i++;
p=p->next;
}
p=head;
for(int i=0;i<size1;i++){
p->val=A[i];
p=p->next;
}
for(int i=0;i<size2;i++){
p->val=B[i];
p=p->next;
}
return head;
} struct ListNode* oddEvenList(struct ListNode* head )
{
if (head == NULL || head->next == NULL)
{
return head;
}
//odd:奇数;even:偶数;evenFirst:保存第一个偶数节点
struct ListNode* odd = head, *even = head->next, *evenHead = head->next;
while (odd->next != NULL && odd != NULL)
{
struct ListNode* oddPrev = odd, *evenPrev = even; //记录odd和even当前值
odd = odd->next->next;
if (odd != NULL)
{
even = odd->next;
evenPrev->next = even;
oddPrev->next = odd;
if (even == NULL) //奇数用到(奇数输入{1, 2, 3}没问题,但其他的有问题)
{
odd->next = evenHead;
}
}
else //偶数用到
{
oddPrev->next = evenHead;
}
}
return head;
} 请大佬帮我分析一下,百思不得其解struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
if(head==0||head->next==0) return head;
//至少存在两个结点
struct ListNode* h1=head;
struct ListNode* h2=head->next;struct ListNode* head2=h2;
struct ListNode* pre_h1=0;
struct ListNode* pre_h2=0;
while(h1->next!=0&&h1->next->next!=0){
pre_h1=h1;h1=h1->next->next;pre_h1->next=h1;
if(h2->next->next!=0){
pre_h2=h2;h2=h2->next->next;pre_h2->next=h2;
}
}
h1->next=head2;h2->next=0;
return head;
} struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
struct ListNode *odd, *even, *prev_odd, *after_odd, *back;
if (head == NULL || head->next == NULL || head->next->next == NULL) {
return head;
}
prev_odd = NULL;
after_odd = NULL;
odd = head;
back = even = head->next;
while (even != NULL) {
after_odd = even->next;
even->next = (even->next != NULL ? even->next->next : NULL);
odd->next = after_odd;
prev_odd = odd;
odd = after_odd;
even = even->next;
}
if (odd != NULL) {
odd->next = back;
}
else {
prev_odd->next = back;
}
return head;
} struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
struct ListNode*p1,*p2;
if(head==NULL) return head;
p1=head; p2=head->next;
while(p1->next && p1->next->next){
p1->next=p1->next->next;
p1=p1->next;
}
while(p2->next && p2->next->next){
p2->next=p2->next->next;
p2=p2->next;
}
p1->next=head->next;
return head;
} /**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
#把偶数位置的节点提出来单独构成链表然后再将两个链表连起来
#include<stdlib.h>
struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
if(head == NULL || head->next ==NULL) return head;
struct ListNode *p , *q, *temp, *tail, *suc = NULL;
tail = (struct ListNode *)malloc(sizeof(struct ListNode));
suc = tail;
int flag = 2;
p = head;
q = head->next;
while(q!=NULL)
{
temp = q->next;
if(flag % 2 == 0)
{
q->next =NULL;
suc->next = q;
q = temp;
suc = suc->next;
}
else
{
p->next = q;
q = temp;
p = p->next;
}
flag ++;
}
p->next = tail->next;
free(tail);
return head;
} 一
struct ListNode* oddEvenList(struct ListNode* head ) {
struct ListNode *odd;
struct ListNode *even = head;
struct ListNode *tmp = head;
struct ListNode *new;
int len = 0;
if (head == NULL)
return NULL;
new = head->next;
odd = new;
if (odd == NULL)
return head;
else
tmp = odd->next;
while(tmp != NULL) {
if (len % 2 == 1) {
odd->next = tmp;
odd = odd->next;
} else {
even->next = tmp;
even = even->next;
}
len++;
tmp = tmp->next;
}
odd->next = NULL;
even->next = new;
return head;
}二
struct ListNode* oddEvenList(struct ListNode* head ) {
int *nums = NULL;
int len = 0;
struct ListNode* mid = head;
struct ListNode* tai = head;
if (head == NULL)
return NULL;
while(tai != NULL && tai->next != NULL) {
len++;
mid = mid->next;
tai = tai->next->next;
}
if (tai != NULL)
len = 2 * len + 1;
else
len = 2 * len;
nums = calloc(sizeof(int), len);
tai = head;
for (int i = 0; i < len; i++, tai = tai->next)
nums[i] = tai->val;
tai = head;
for (int i = 0; i < len; i++, tai = tai->next) {
if (i < (len + 1) / 2)
tai->val = nums[i * 2];
else
tai->val = nums[(i - (len + 1) / 2) * 2 + 1];
}
return head;
}
#define MAX_SIZE 200000
struct ListNode* oddEvenList(struct ListNode* head ) {
// write code here
struct ListNode *p = head;
int temp[MAX_SIZE] = {0};
int idx = 0;
while (p) {
temp[idx++] = p->val;
p = p->next;
}
p = head;
for (int i = 0; i < idx; i += 2) {
p->val = temp[i];
p = p->next;
}
for (int i = 1; i < idx; i += 2) {
p->val = temp[i];
p = p->next;
}
return head;
}