328. 奇偶链表

迭代

class Solution {
    public ListNode oddEvenList(ListNode head) {

        if (head == null){
            return head;
        }

        /**
         * 类似于《86. 分割链表》,奇数位置的节点不动,将偶数位置的节点全部放到最后面,原地完成
         */
        ListNode prev = new ListNode(-1);
        prev.next = head;
        ListNode cur = head;
        ListNode last = cur;
        int size = 1;

        while (last.next != null){

            last = last.next;
            size++;
        }

        /**
         * 使用size和for循环来遍历,因为需要判断索引的奇偶性,不能用while循环
         */
        for (int i = 1; i <= size; i++) {

            if (i % 2 != 0){

                prev = cur;
                cur = cur.next;
            }
            else {

                /**
                 * 将节点放到最后,还要维护下last
                 * 如果这是最后一个节点,就不用判断了
                 */
                if (cur.next == null){
                    break;
                }

                prev.next = cur.next;
                last.next = cur;
                last = last.next;
                cur = prev.next;
            }
        }

        /**
         * 最终的last要指向null,头节点始终是奇数不用动
         */
        last.next = null;

        return head;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——不用单独判断奇偶

class Solution {
    public ListNode oddEvenList(ListNode head) {

        if (head == null || head.next == null){
            return head;
        }

        /**
         * 先保证至少有两个节点,分别作为奇链表和偶链表的头节点
         * 遍历时奇节点指向下一个偶节点的next,偶节点指向下一个奇节点的next,完成一轮节点分离
         */
        ListNode oddHead = head;
        ListNode evenHead = head.next;
        ListNode odd = oddHead;
        ListNode even = evenHead;

        /**
         * 每当判断一个节点的next是否为空时,一定要先保证自己不为空
         */
        while (even != null && even.next != null){

            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }

        odd.next = evenHead;

        return oddHead;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/odd-even-linked-list/

posted @ 2021-12-09 20:51  振袖秋枫问红叶  阅读(48)  评论(0)    收藏  举报