题目链接:奇偶链表
题目
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 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() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode oddEvenList(ListNode head) {
ListNode odd = new ListNode(), even = new ListNode(), op, ep; // 奇偶节点的头节点(便于操作)及尾指针
int i = 1; // 记录是第几个节点
op = odd;
ep = even;
while(head != null) {
if(i%2==1) {
op.next = head;
op = op.next;
} else {
ep.next = head;
ep = ep.next;
}
head = head.next;
++i;
}
ep.next = null;
op.next = even.next; // even.next,去掉even的头节点
return odd.next; // 返回的链表要求无头
}
}
改进
上面为了方便操作申请了两个头节点,在计算机中并不会占用太多空间,无关紧要,但如果在嵌入式系统或者一些内存较小的设备中运行,应该去掉那两个头节点,直接定义两个引用,指向已有的节点,而不是申请新的空间。
Comments | NOTHING