给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足
,节点中的值都满足 
要求:空间复杂度
,时间复杂度
{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内。
public ListNode oddEvenList (ListNode head) {
// write code here
if(head == null || head.next == null) return head;
ListNode evenHead = head.next;
ListNode odd = head,even = head.next;
while(even != null && even.next != null){
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
} public ListNode oddEvenList(ListNode head) {
if(head==null) return head;
//无需对头节点做操作 不用dummyHead
//奇链表头位于head 偶链表头位于head.next
ListNode oddHead = head,evenHead = head.next;
ListNode odd = oddHead,even = evenHead;
//终止条件:因为even走在前面 一定先终止 所以判断条件就是它
//节点总数为偶数个时 even.next为null
//节点总数为奇数个时: even==null 这俩条件触发一个就跳出循环
while (even!=null&&even.next!=null){
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
//奇偶链表拼接
odd.next = evenHead;
return head;
} class Solution:
def oddEvenList(self , head: ListNode) -> ListNode:
# write code here
evenHead = head.next # 偶数的第一个
odd = head # 奇数
even = head.next # 偶数
while even and even.next:
odd.next = even.next # 奇数指向奇数
odd = odd.next
even.next = odd.next # 偶数指向偶数
even = even.next
odd.next = evenHead # 奇数最后一个指向偶数第一个
return head
function oddEvenList( head ) {
// write code here
if(!head) return head
let odd = head ///扫描奇链节点
let even = head.next ///扫描偶链节点
let evenHead = even //保存偶数链的节点
while(even&&even.next){
odd.next = odd.next.next //指向下一个奇数节点
even.next = even.next.next //指向下一个奇数节点
odd = odd.next //odd推进到下一个奇数节点
even = even.next //even推进到下一个偶数节点
}
odd.next = evenHead //奇数链连上偶数链
return head
} class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* oddEvenList(ListNode* head) {
// write code here
ListNode* odd = head, *even = head, *curr, *pre;
if (head->val % 2 == 0) {
while (odd && odd->val % 2 == 0) {
odd = odd->next;
}
pre = odd;
curr = odd->next;
} else {
while (even && even->val % 2 == 1) {
even = even->next;
}
pre = even;
curr = even->next;
}
while (curr) {
if (curr->val % 2 == 1) {
if (pre == even) {
pre->next = curr->next;
curr->next = odd->next;
odd->next = curr;
curr = pre->next;
odd = odd->next;
}else {
odd = odd->next;
pre = pre->next;
curr = curr->next;
}
} else {
if (pre == odd) {
pre->next = curr->next;
curr->next = even->next;
even->next = curr;
curr = pre->next;
even = even->next;
}else {
even = even->next;
pre = pre->next;
curr = curr->next;
}
}
}
return head;
}
}; 按编号: /**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* oddEvenList(ListNode* head) {
// write code here
if(head==nullptr) return nullptr;
ListNode *evenhead=head->next, *odd=head, *even=evenhead;
while (even&&even->next) {
odd->next = even->next;
even->next = even->next->next;
odd = odd->next;
even = even->next;
}
odd->next = evenhead;
return head;
}
}; public ListNode oddEvenList (ListNode head) {
// write code here
if (head==null)return head;
ListNode ji=head;
ListNode ou=head.next;
ListNode jiCur=ji;
ListNode ouCur=ou;
//分别建立奇链表和偶链表,然后将两个链表连起来
while (jiCur!=null&&ouCur!=null&&jiCur.next!=null&&ouCur.next!=null){
jiCur.next=jiCur.next.next;
jiCur=jiCur.next;
ouCur.next=ouCur.next.next;
ouCur=ouCur.next;
}
jiCur.next=ou;
return ji;
} import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode oddEvenList (ListNode head) {
// write code here
//假设第一个节点为奇数,所以在代码中体现出来最后一个奇数节点必定指向第一个偶数节点,
//原地算法:使空间复杂度为常数。定义odd,even,evenHead.每次都向前推进,只不过奇数找奇数,偶数找偶数。
if(head == null) return null;
ListNode odd = head,even = odd.next,evenHead = even;
while(even != null && even.next != null ){
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
} /**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* oddEvenList(ListNode* head) {
// write code here
// if(head == NULL) return head;
// ListNode *oldhead = head, *evenhead = head->next;
// ListNode *oldp = head, *evenp = evenhead;
// while(evenp != NULL && evenp->next != NULL){
// oldp->next = evenp->next;
// oldp = oldp->next;
// evenp->next = oldp->next;
// evenp = evenp->next;
// }
// oldp->next = evenhead;
// return head;
if(head == NULL) return head;
ListNode *ohead = new ListNode(0), *ehead = new ListNode(0);
ListNode *p = head, *p1 = ohead, *p2 = ehead;
int cnt = 1;
while(p != NULL){
ListNode *tmp = p->next;
if(cnt%2 == 1){
p->next = p1->next;
p1->next = p;
p1 = p1->next;
}
else{
p->next = p2->next;
p2->next = p;
p2 = p2->next;
}
p = tmp;
++cnt;
}
p1->next = ehead->next;
ehead->next = NULL;
free(ehead);
ohead->next = NULL;
free(ohead);
return head;
}
};
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* oddEvenList(ListNode* head) {
// write code here
if(head == NULL) return head;
ListNode *oldhead = head, *evenhead = head->next;
ListNode *oldp = head, *evenp = evenhead;
while(evenp != NULL && evenp->next != NULL){
oldp->next = evenp->next;
oldp = oldp->next;
evenp->next = oldp->next;
evenp = evenp->next;
}
oldp->next = evenhead;
return head;
// if(head == NULL) return head;
// ListNode *ohead = new ListNode(0), *ehead = new ListNode(0);
// ListNode *p = head, *p1 = ohead, *p2 = ehead;
// int cnt = 1;
// while(p != NULL){
// ListNode *tmp = p->next;
// if(cnt%2 == 1){
// p->next = p1->next;
// p1->next = p;
// p1 = p1->next;
// }
// else{
// p->next = p2->next;
// p2->next = p;
// p2 = p2->next;
// }
// p = tmp;
// ++cnt;
// }
// p1->next = ehead->next;
// ehead->next = NULL;
// free(ehead);
// ohead->next = NULL;
// free(ohead);
// return head;
}
};
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode oddEvenList (ListNode head) {
// write code here
int flag=0;
ListNode odd=new ListNode(0);
ListNode node=odd;
ListNode pre=head;
ListNode cur=head;
while(cur!=null){
if(flag%2==1){
pre.next=cur.next;
ListNode temp=cur;
temp.next=null;
odd.next=temp;
odd=odd.next;
cur=pre;
}
pre=cur;
cur=cur.next;
flag++;
}
pre.next=node.next;
return head;
}
} class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* oddEvenList(ListNode* head) {
// 空链表或者只有一个结点
if(!head || !head->next) {
return head;
}
ListNode *oddHead = new ListNode(0), *everHead = new ListNode(0);
ListNode *odd = oddHead, *ever = everHead;
int id = 0;
ListNode *p = head;
while(p) {
if((++id) % 2 == 0) {
odd->next = p;
odd = p;
}
else {
ever->next = p;
ever = p;
}
p = p->next;
}
ever->next = NULL;
odd->next = NULL;
ever->next = oddHead->next;
return everHead->next;
}
}; # class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param head ListNode类 # @return ListNode类 # class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here p = head if p is None: return head head1,head2 = ListNode(-1),ListNode(-1) q1,q2 = head1,head2 ans = 1 while p: if ans % 2 == 0: q2.next = p q2 = p elif ans % 2 != 0: q1.next = p q1 = p p = p.next ans += 1 if q1.next == q2: q1.next = head2.next q2.next = None elif q2.next == q1: q1.next = head2.next q2.next = None return head1.next
ListNode* oddEvenList(ListNode* head) {
if(head==nullptr){
return nullptr;
}
if(head->next==nullptr){
return head;
}
ListNode* even=head,*odd=head->next;
ListNode* ji=even,*od=odd;
while (od!=nullptr&&od->next!=nullptr) {
ji->next=ji->next->next;
ji=ji->next;
od->next=od->next->next;
od=od->next;
}
ji->next=odd;
return even;
}
}; struct ListNode* oddEvenList(struct ListNode* head ) {
if(head==NULL || head->next==NULL)return head;
struct ListNode* odd=head,*even=head->next;
struct ListNode* p=head->next->next,*q=even;
int cnt=0;
while(p)
{
cnt++;
if(cnt%2==1)
{
odd->next=p;
odd=p;
}
else {
even->next=p;
even=p;
}
p=p->next;
}
even->next=NULL;
odd->next=q;
return head;
} 时间复杂on,空间复杂度o1# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param head ListNode类 # @return ListNode类 # class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here if not head: return None oddHead = head.next # 奇偶指针 left, right = head, head.next while right and right.next: left.next = right.next left = left.next right.next = left.next right = right.next left.next = oddHead return head
class Solution: def oddEvenList(self , head: ListNode) -> ListNode: # write code here odd_head = ListNode(0) even_head = ListNode(0) p_odd = odd_head p_even = even_head flag = True p = head while p: if flag: p_odd.next = p p_odd = p else: p_even.next = p p_even = p p = p.next flag = not flag p_odd.next = even_head.next p_even.next = None return odd_head.next
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;
} public ListNode oddEvenList (ListNode head) {
//空 一个 两个节点 直接返回
if(head==null||head.next==null||head.next.next==null)
return head;
ListNode snd = head.next;//偶数头
ListNode cur1 = head;//处理奇数节点
ListNode cur2 = snd;//处理偶数节点
while(cur1!=null&&cur2!=null){//奇数连接、偶数连接
cur1.next = cur2.next;
if(cur2.next==null) break;
cur1 = cur2.next;
cur2.next = cur1.next;
cur2 = cur1.next;
}
cur1.next = snd;//奇数尾连接偶数头
return head;
}