奇偶链表

41 阅读1分钟
/**
 * 给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
 *
 * 第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
 *
 * 请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
 *
 * 你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
 *
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/odd-even-linked-list
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class OddEvenList {

    /**
     * 题解:
     * 1. 获取奇数链表的首个节点odd;
     * 2. 获取偶数链表的首个节点even;
     * 3. 还需要有一个evenHeaad始终指定偶数链表的第一个节点;(用于将偶数链表接至奇数链表最后一个节点后)
     * 4. 判断当前evene节点以及其后的节点是否为null;
     *  4.1 如果均不为空的话,代表odd和even后面都需要增加一个节点;
     *  4.2 odd节点后新增节点为even.next,并后移一个节点;
     *  4.3 even节点后新增一个节点,为odd.next(是不是null都无所谓,下一个while循环会进行判断),并且even需指向下一个奇数节点,及odd.next
     * 5. 直至even ==null || even.next == null 退出while循环;
     * 6. 将odd.next = evenHead;
     * 7. renturn head.
     * @param head
     * @return
     */
    public ListNode oddEvenList(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode evenHead = head.next;
        ListNode odd = head;
        ListNode even = evenHead;
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }

    private class ListNode {
        ListNode next;
    }
}