给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。
LINK:LeetBook 328. 奇偶链表
使用原地算法完成。
空间复杂度应为:O(1),时间复杂度应:O(n)。
public ListNode oddEvenList(ListNode head) {
if (head == null){
return null;
}
ListNode even = head;
ListNode odd = null;
ListNode oddHead = head.next;
ListNode cur = head.next;
int n = 1;
while (cur != null){
n++;
if (n == 2){
odd = cur;
}
else if (n%2==0){
odd.next = cur;
odd = odd.next;
}
else {
even.next = cur;
even = even.next;
}
cur = cur.next;
}
// 保证生成的奇偶链表最后结点.next为null,否则会生成循环链表
if (even.next != null) even.next=null;
if ( odd!=null && odd.next != null) odd.next=null;
even.next = oddHead;
return head;
}
public ListNode oddEvenList(ListNode head) {
if (head == null){
return null;
}
ListNode evenst = head;
ListNode evened = head;
ListNode oddst = head.next;
ListNode odded = head.next;
while (odded!=null && odded.next!=null && evenst.next!=null){
evened.next = odded.next;
evened = evened.next;
odded.next = evened.next;
odded = odded.next;
}
evened.next = oddst;
return head;
}