迭代
class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null){
return head;
}
/**
* 类似于《86. 分割链表》,奇数位置的节点不动,将偶数位置的节点全部放到最后面,原地完成
*/
ListNode prev = new ListNode(-1);
prev.next = head;
ListNode cur = head;
ListNode last = cur;
int size = 1;
while (last.next != null){
last = last.next;
size++;
}
/**
* 使用size和for循环来遍历,因为需要判断索引的奇偶性,不能用while循环
*/
for (int i = 1; i <= size; i++) {
if (i % 2 != 0){
prev = cur;
cur = cur.next;
}
else {
/**
* 将节点放到最后,还要维护下last
* 如果这是最后一个节点,就不用判断了
*/
if (cur.next == null){
break;
}
prev.next = cur.next;
last.next = cur;
last = last.next;
cur = prev.next;
}
}
/**
* 最终的last要指向null,头节点始终是奇数不用动
*/
last.next = null;
return head;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化1——不用单独判断奇偶
class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null || head.next == null){
return head;
}
/**
* 先保证至少有两个节点,分别作为奇链表和偶链表的头节点
* 遍历时奇节点指向下一个偶节点的next,偶节点指向下一个奇节点的next,完成一轮节点分离
*/
ListNode oddHead = head;
ListNode evenHead = head.next;
ListNode odd = oddHead;
ListNode even = evenHead;
/**
* 每当判断一个节点的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 oddHead;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/odd-even-linked-list/