题目
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
说明:
1、应当保持奇数节点和偶数节点的相对顺序。
2、链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
示例
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
思路
我们分别保存奇偶链表的尾节点和偶链表的头节点,然后每次把奇偶节点加入奇偶链表尾节点的后面,最后再把奇链表的尾节点和偶链表的头节点连接上。
代码
public class problem328 {
// 节点类
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
// 传入数组,生成链表(辅助测试用)
public ListNode createList(int[] num) {
if (num.length == 0)
return null;
ListNode head = new ListNode(num[0]);
ListNode res = head;
for (int i = 1; i < num.length; i++) {
head.next = new ListNode(num[i]);
head = head.next;
}
return res;
}
public ListNode oddEvenList(ListNode head) {
if (head == null) return null;
ListNode odd = head, even = head.next, evenHead = even;
while (even != null && even.next != null) {
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
public static void main(String[] args) {
problem328 pro=new problem328();
int[] nums={1,2,3,4,5,6,7,8,9};
ListNode node=pro.oddEvenList(pro.createList(nums));
while(node!=null){
System.out.print(node.val+" ");
node=node.next;
}
}
}