链表的奇偶重排
描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
数据范围:节点数量满足
0
≤
n
≤
1
0
5
0≤n≤10^5
0≤n≤105,节点中的值都满足0≤val≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
示例1
输入:{1,2,3,4,5,6}
返回值:{1,3,5,2,4,6}
说明:1->2->3->4->5->6->NULL
重排后为1->3->5->2->4->6->NULL
示例2
输入:{1,4,6,3,7}
返回值:{1,6,7,4,3}
说明:1->4->6->3->7->NULL
重排后为1->6->7->4->3->NULL
奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3
备注:
链表长度不大于200000。每个数范围均在int内。
思路:
该问题比较简单,遍历一遍原链表,维持两个奇偶链表,最后将两个链表合并即可
代码
public ListNode oddEvenList (ListNode head) {
ListNode oddHead = new ListNode(-1);
ListNode evenHead = new ListNode(-1);
boolean ifOdd = true;
ListNode cur = head;
ListNode odd = oddHead;
ListNode even = evenHead;
while(cur!=null){
if(ifOdd){
odd.next = cur;
odd = odd.next;
}
else{
even.next = cur;
even = even.next;
}
cur = cur.next;
ifOdd = !ifOdd;
}
even.next = null;//注意一定要有这个操作,把偶链表的结尾置为空,否则对于原链表为奇数的情况会产生环
odd.next = evenHead.next;
return oddHead.next;
}