牛客网高频算法习题系列-BM14-链表的奇偶重排问题描述给定一个单向链表,请设置一个函数,将奇偶-将链表的编号节点和偶数节点放在一起,重排后输出。请注意,它是节点的编号而不是节点的值。参见原题:BM14链表奇偶重排方案一:链表遍历(使用额外空间)首先判断链表是否为空或者只有1、2个节点,不重排直接返回原链表。否则,用2个列表额外记录奇数和偶数节点。过程如下:遍历链表,将奇数和偶数节点值分别放入不同链表;按照的顺序,将两个列表中的值重新整理成一个新的链表,也就是重新排列后的链表,并返回。解法二:双指针方法同上,首先如果链表为空或者只有1、2个节点,直接返回原链表,不重新排列。否则,用奇偶节点分别指向链表的第一个(奇数)和第二个(偶数)节点,然后遍历链表分别连接奇数节点和偶数节点,并最后,把偶数的放在奇数链表后面,也就是重排链表。代码importjava.util.ArrayList;importjava.util.List;publicclassBm014{/***使用额外空间**@paramheadListNodeclass*@returnListNodeclass*/publicstaticListNodeoddEvenList(ListNodehead){//如果链表为空或者只有1个或2个节点,不需要重新排列if(head==null||head.next==null||head.next.next==null){}//奇数节点Listodds=newArrayList<>();//偶节点Listevens=newArrayList<>();诠释我=1;while(head!=null){if(i%2==1){odds.add(head.val);}else{evens.add(head.val);}head=head.next;我++;}ListNodenewHead=newListNode(-1),cur=newHead;for(Integerval:odds){cur.next=newListNode(val);cur=cur.next;}for(Integerval:evens){cur.next=新列表节点(val);cur=cur.next;}返回newHead.next;}/***双指针法**@paramhead*@return*/publicstaticListNodeoddEvenList2(ListNodehead){//如果链表为空或者只有1、2个节点,不需要重排if(head==空||head.next==null||head.next.next==null){returnhead;}//奇数节点ListNodeodd=head;//偶数节点,偶数链表的头ListNodeevenHead=head.next,even=evenHead;while(even!=null&&even.next!=null){//oddconnectoddbitnodeodd.next=even.next;奇数=奇数.下一个;//even连接偶数节点even.next=odd.next;even=even.next;}//最后将奇数链表的最后一个节点指向偶数链表头的表odd.next=evenHead;返回头;}publicstaticvoidmain(String[]args){ListNodehead=ListNode.testCase5();System.out.println("原链表为");ListNode.print(头);System.out.println("重排链表为");ListNode.print(oddEvenList(head));ListNode.print(oddEvenList2(head));}}$1.01^{365}≈37.7834343329$$0.99^{365}≈0.02551796445$相信坚持的力量!