题目:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。
请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。
你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
分出来两个子链表,一个头是head 代表奇数链, 一个头是head.next 代表偶数链
并且用奇偶指针p和q工作 每次前进两步 把找到的旧节点分布赋给两个链表
public ListNode oddEvenList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode evenHead = head.next;
ListNode p = head, q = p.next;
while (q != null && q.next != null) {
p.next = q.next;
p = p.next;
q.next = p.next;// while 条件保证此时p不是null
q = q.next;
} // 出循环时,p一定指向奇链表尾,不会指向null,因为p = while条件里的q.next
p.next = evenHead;
return head;
}