您的位置:首页 > 其它

328. Odd Even Linked List

2016-01-26 15:08 211 查看
问题:

单链表位于奇数位置的统一放在前面,位于偶数位置的统一放在后面

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
.

思路:

一个很傻的想法:扫描一遍,找到链表的长度和链表的tail。再扫描一遍,把偶数的挂在tail后面即可
一个比较不傻的想法:只循环一遍。保存下第一个偶节点的位置。分别用两个指针,一个指向第一个节点,一个指向第二个节点,移动的过程中把奇偶俩条链子连接好,直到这两个指针中有一个的next为空(思考一下,无论是哪一个指针这时的next为空,偶数链条最后一个的next都为空)。最后把两条链接起来。

程序
第一种的程序
public class Solution {
public ListNode oddEvenList(ListNode head) {
if(head == null) return null;
if(head.next == null) return head;
ListNode tail = head;
int count = 1;
while(tail.next != null) {
tail = tail.next;
count++;
}
ListNode h = head;
for(int i = 0; i < count/2; i++) {
ListNode tmp = h.next;
tail.next = tmp;
h.next = tmp.next;
tail = tail.next;
h = h.next;
}
tail.next = null;
return head;
}
}





第二种的程序
public class Solution {
public ListNode oddEvenList(ListNode head) {
if(head == null || head.next == null ) return head;
ListNode oddhead = head;
ListNode sevenhead = head.next;
ListNode evenhead = head.next;
while(oddhead.next != null && evenhead.next != null) {
oddhead.next = oddhead.next.next;
oddhead = oddhead.next;
evenhead.next = evenhead.next.next;
evenhead = evenhead.next;
}
oddhead.next = sevenhead;
return head;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: