给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
两个输出示例:
思路分析:
1- > 2 - > 3 - > 4 - > 5
总体思路是把奇数连成一条链,偶数连成一条链,再把偶数的接到奇数后面
第一步:开始时head指向1,如果head.next=null,即只有一个结点,直接返回head就行
如果head.next.next=null,即只有两个结点,前面的是奇数结点,后面的是偶数结点
也可以直接返回head (比如1 - > 2 )
第二步:我们定义一个结点指向奇数索引的结点: ListNode odd=head;
再定义一个结点指向偶数索引的结点: ListNode even=head.next;
记录odd的头: oddhead=head 记录even的头:evenhead=head.next
第三步:
1- > 2 - > 3 - > 4 - > 5
我们以上面这个为例:(再强调一遍odd代表奇数索引,even代表偶数索引)
odd指向1,even指向2
odd.next=even.next odd移到下一个odd的位置:odd=odd.next
even.next=odd.next even移到下一个even的位置:even=even.next
只要odd=null even=null odd.next=null even.next=null 这里任意一个满足,就可以退出循环
最后记得把偶链连到奇链后面
odd.next=evenhead;
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head==null||head.next==null||head.next.next==null)
{
return head;
}
ListNode odd=head;
ListNode even=head.next;
ListNode evenhead=head.next;
ListNode oddhead=head;
while(odd!=null&&even!=null&&odd.next!=null&&even.next!=null){
even=odd.next;
odd.next=even.next;
odd=odd.next;
even.next=odd.next;
even=even.next;
}
odd.next=evenhead;
return oddhead;
}
}