题目描述
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
输入输出样例
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
题解
奇数节点放在前面,偶数节点放在后面,并且相对顺序不能改变。
可以想到应该需要两个指针,分别承担建立两个链表的重任。同时,需要注意的是,如何将偶数链表拼接到奇数链表的后面,势必需要第三个节点。
链表的这类题,可以通过画图,从图上获得一点启示
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head == null) return null;
ListNode odd = head; ListNode even = head.next; ListNode evenHead = even;
while(even != null && even.next != null){
// 奇数链表的下一个,是偶数链表.next
odd.next = even.next;
odd = odd.next;
// 奇数链表的节点,新增了一个,刚好是在自己屁股后面,
// 那么odd.next就是偶数节点
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
}