【LeetCode刷题】奇偶链表


题目链接:奇偶链表

题目

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 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;  // 返回的链表要求无头
    }
}

改进

上面为了方便操作申请了两个头节点,在计算机中并不会占用太多空间,无关紧要,但如果在嵌入式系统或者一些内存较小的设备中运行,应该去掉那两个头节点,直接定义两个引用,指向已有的节点,而不是申请新的空间。

声明:迟於|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 【LeetCode刷题】奇偶链表


栖迟於一丘