Leet Code OJ 328. Odd Even Linked List [Difficulty: Easy]
题目:
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.
You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.
Example:
Given 1->2->3->4->5->NULL,
return 1->3->5->2->4->NULL.
Note:
The relative order inside both the even and odd groups should remain as it was in the input.
The first node is considered odd, the second node even and so on …
翻译:
给定一个单链表,把全部的奇数节点放到一起,全部的偶数节点放到单数节点的后面。请注意这里我们讨论的是节点的编号的奇数偶数,而不是节点的值。
你应该直接在链表上去做。这个程序应该执行在O(1)的空间复杂度和O(节点数)的时间复杂度。
提示:这些奇数偶数区域中相关联的前后顺序。应该和输入的时候一样。第一个节点作为奇数节点,第二个作为偶数节点,由此类推。
。。
分析:
本题比較easy出错的地方,第一个是看错题目。把编号的奇偶数看成节点值的奇偶数;第二个是移动节点时。对于next指针的处理上。假设没有把next正确指向,有可能把链表变成循环列表。这个时候就会出现“Memory Limit Exceeded”这种错误了。以下的代码创建了多个暂时变量,把奇数偶数节点分开为2个链表,最后再合并的做法。也是为了代码清晰易读,事实上是能够有更精简的写法的,欢迎读者补充。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode oddEvenList(ListNode head) {
ListNode oddFirstNode = new ListNode(0);
ListNode oddCurrentNode = oddFirstNode;
ListNode evenFirstNode = new ListNode(0);
ListNode evenCurrentNode = evenFirstNode;
int count=1;
while (head != null) {
ListNode temp=head.next;
if (count% 2 == 1) {
oddCurrentNode.next=head;
oddCurrentNode=head;
} else {
evenCurrentNode.next=head;
evenCurrentNode=head;
}
head.next=null;
head = temp;
count++;
}
oddCurrentNode.next=evenFirstNode.next;
return oddFirstNode.next;
}
}