题意:输入单链表,按照节点的奇数序和偶数序分组,先奇后偶,要去空间复杂度O(1),时间复杂度O(n),n为单链表中的节点数,同一组中的先对顺序不变
思路:顺次扫面(next),依次将串到奇数序列、偶数序列,最后将偶数序列的首部串到奇数序列的尾部,注意将偶数序列的尾部置null,否则当节点个数是奇数个时会出现死循环,导致空间溢出。
public ListNode oddEvenList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode evenHead = head.next, evenlast = evenHead, next = evenHead.next;
ListNode oddLast = head, tp;
boolean flag = true; //odd : true; even : false
while(next != null){
if(flag){
oddLast.next = next;
oddLast = next;
}else{
evenlast.next = next;
evenlast = next;
}
flag = !flag;
next = next.next;
}
oddLast.next = evenHead;
evenlast.next = null;
return head;
}