题目
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
思路:双指针,一个指针用来指向奇数链表,一个指针用来指向偶数链表,最后把这两个链表合并。
public ListNode oddEvenList(ListNode head) {
// 如果链表为空 或者只有一个元素,就返回链表即可
if(head == null || head.next == null){
return head;
}
// odd,even记录初始奇偶节点
// temp1 temp2 遍历
ListNode odd = head;
ListNode even = head.next;
ListNode temp1 = odd;
ListNode temp2 = even;
// 遍历
while ((temp1.next!=null && temp1.next.next!=null) && (temp2.next!=null && temp2.next.next!=null)){
temp1.next = temp1.next.next;
temp2.next = temp2.next.next;
temp1 = temp1.next;
temp2 = temp2.next;
}
// 这里解释一下为什么只有奇数需要判断,因为一个链表,如果偶数链表有值,那奇数链表一定也有
// 比如有6个元素,那5肯定有。
// 如果只有5个元素,那说明6就没有了。即无论如何偶数链表在while循环就能结束。
// 所以偶数temp2最后指向null即可。
if(temp1.next == null || temp1.next.next == null){
temp1.next = null;
}else {
temp1.next = temp1.next.next;
temp1 = temp1.next;
}
// 合并 并 返回
temp2.next = null;
temp1.next = even;
return odd;
}