版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/83990426
题目及测试
package pid328;
/* 奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
说明:
应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
*/
public class main {
public static void main(String[] args) {
LinkList a=new LinkList(1);
a.addLast(2);
a.addLast(3);
a.addLast(4);
a.addLast(5);
a.printList();
test(a.first);
LinkList b=new LinkList(5);
b.addLast(6);
b.addLast(4);
b.addLast(2);
b.addLast(1);
b.addLast(3);
b.printList();
test(b.first);
/*
LinkList c=new LinkList(1);
c.addLast(2);
c.addLast(2);
c.addLast(1);
c.printList();
//test(c.first);
LinkList d=new LinkList(1);
d.addLast(2);
d.addLast(3);
c.printList();
d.printList();
test(c.first,d.first);*/
}
private static void test(ListNode ito) {
Solution solution = new Solution();
ListNode rtn;
long begin = System.currentTimeMillis();
System.out.println();
//开始时打印数组
rtn=solution.oddEvenList(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn=");
rtn.printNodeToEnd();
//System.out.println(":rtn" );
//System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,4ms,超快)
双指针,设置奇数的头尾,偶数的头尾,在一次遍历中,如果该为奇数位,则奇数的尾.next=now,偶数亦然,最后奇数尾.next=偶数头,偶数尾.next=null
package pid328;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode evenHead=head.next;
ListNode oddTail=head;
ListNode evenTail=evenHead;
ListNode now=evenHead.next;
boolean isOdd=true;
while(now!=null){
if(isOdd){
oddTail.next=now;
oddTail=oddTail.next;
isOdd=false;
}
else{
evenTail.next=now;
evenTail=evenTail.next;
isOdd=true;
}
now=now.next;
}
oddTail.next=evenHead;
evenTail.next=null;
return head;
}
}
扫描二维码关注公众号,回复:
4046422 查看本文章