题目链接
题目描述
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 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
说明:
应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/odd-even-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
1、题目要求时间复杂度是O(n),空间复杂度是O(1),说明只让我们遍历一遍链表
2、可以设置两个指针p和q,分别指向奇数节点的开始位置和偶数节点开始的位置
3、可以发现奇数节点的下一个节点是偶数节点的下一个节点
4、偶数节点的下一个节点是奇数节点的下一个节点
5、就像麻花一样
通过代码
class Solution {
public ListNode oddEvenList(ListNode head) {
if ((head==null)||(head.next==null)) return head;
ListNode p =head;
ListNode q=head.next;
ListNode x=q;
for(;;){
if (q.next!=null){
p.next=q.next;
p=p.next;
}else break;
if (p.next!=null){
q.next=p.next;
q=q.next;
}else{
q.next=null;
break;
}
}
p.next=x;
return head;
}
}