给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足 ,节点中的值都满足
要求:空间复杂度 ,时间复杂度
{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* 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; }