题目描述
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 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
思路及解答
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head == null)
return null;
//如果只有一个结点
if(head.next == null){
return head;
}
ListNode j = head;
ListNode o = head.next;
ListNode firstO = head.next;//保存第一个偶结点的位置
int count = countLength(head);
//分别将奇结点和偶结点连接起来
while(o.next != null){
j.next = o.next;
j = o;
o = j.next;
}
//如果链表的长度为偶数
if((count%2) == 0){
j.next = firstO;
o.next = null;
//如果链表的长度为奇数
}else if(count%2 != 0){
o.next = firstO;
j.next = null;
}
return head;
}
//此函数用于计算链表的长度
public int countLength(ListNode head){
int count = 0;
while(head != null){
head = head.next;
count++;
}
return count;
}
}