思路:考虑使用两个辅助队列,构造新链表
- 一次遍历链表,将奇数节点值依次入队q1,偶数节点值依次入队q2
- 依次将q1中节点值出队,构造新节点,接在新链表后面。然后q2中节点值出队,构造新节点,接在新链表后面
- 最后返回新链表头节点
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode oddEvenList (ListNode head) {
// 思路:两个队列 (q1中放奇数节点,q2中放偶数节点),然后先将q1依次出队,放在新链表后面,再将q2依次出队,放在后面
Queue<Integer> q1 = new LinkedList<>(); // 存放奇数节点值的队列
Queue<Integer> q2 = new LinkedList<>(); // 存放偶数节点值的队列
ListNode node = new ListNode(-1); // 虚拟头节点
ListNode newNode = node;
int index = 1; // 节点计数
while(head != null){
if(index % 2 != 0){ // 奇数节点值入队q1
q1.offer(head.val);
}else{ // 偶数节点值入队q2
q2.offer(head.val);
}
index++;
head = head.next;
}
while(!q1.isEmpty()){ // q1中节点值出队
node.next = new ListNode(q1.poll());
node = node.next;
}
while(!q2.isEmpty()){ // q2中节点值出队
node.next = new ListNode(q2.poll());
node = node.next;
}
return newNode.next;
}
}