美文网首页
牛客网高频算法题系列-BM14-链表的奇偶重排

牛客网高频算法题系列-BM14-链表的奇偶重排

作者: 醉舞经阁半卷书 | 来源:发表于2022-06-07 09:48 被阅读0次

    牛客网高频算法题系列-BM14-链表的奇偶重排

    题目描述

    给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
    注意是节点的编号而非节点的数值。

    原题目见:BM14 链表的奇偶重排

    解法一:链表遍历(使用额外空间)

    首先,判断如果链表为空或者只有1或2个结点,不用重排,直接返回原链表。

    否则,使用2个list额外记录奇数和偶数位的结点,处理过程如下:

    • 遍历链表,分别将奇数和偶数位的结点值放到不同的list中;
    • 按照奇数位在前、偶数位在后的顺序,将2个list中的值重组成新的链表即为重排后的链表,返回之。

    解法二:双指针法

    同样的,首先要判断如果链表为空或者只有1或2个结点,不用重排,直接返回原链表。

    否则,使用odd和even结点分别指向链表的第一个(奇数)和第二个(偶数)结点,然后遍历链表,将奇数位的结点和偶数位的结点分别连接起来,最后,将偶数位的放到奇数位的链表后面,即为重排后的链表。

    代码

    import java.util.ArrayList;
    import java.util.List;
    
    public class Bm014 {
        /**
         * 使用额外的空间
         *
         * @param head ListNode类
         * @return ListNode类
         */
        public static ListNode oddEvenList(ListNode head) {
            // 如果链表为空或者只有1或2个结点,不用重排
            if (head == null || head.next == null || head.next.next == null) {
                return head;
            }
            // 奇数结点
            List<Integer> odds = new ArrayList<>();
            // 偶数结点
            List<Integer> evens = new ArrayList<>();
    
            int i = 1;
            while (head != null) {
                if (i % 2 == 1) {
                    odds.add(head.val);
                } else {
                    evens.add(head.val);
                }
                head = head.next;
                i++;
            }
    
            ListNode newHead = new ListNode(-1), cur = newHead;
            for (Integer val : odds) {
                cur.next = new ListNode(val);
                cur = cur.next;
            }
            for (Integer val : evens) {
                cur.next = new ListNode(val);
                cur = cur.next;
            }
    
            return newHead.next;
        }
    
        /**
         * 双指针法
         *
         * @param head
         * @return
         */
        public static ListNode oddEvenList2(ListNode head) {
            // 如果链表为空或者只有1或2个结点,不用重排
            if (head == null || head.next == null || head.next.next == null) {
                return head;
            }
    
            // 奇数结点
            ListNode odd = head;
            // 偶数结点,偶数链表头
            ListNode evenHead = head.next, even = evenHead;
            while (even != null && even.next != null) {
                // odd连接奇数位结点
                odd.next = even.next;
                odd = odd.next;
                // even连接偶数位结点
                even.next = odd.next;
                even = even.next;
            }
            // 最后将odd链表的最后一个结点指向even链表的表头
            odd.next = evenHead;
            return head;
        }
    
        public static void main(String[] args) {
            ListNode head = ListNode.testCase5();
            System.out.println("原链表为");
            ListNode.print(head);
    
            System.out.println("重排后的链表为");
            ListNode.print(oddEvenList(head));
            ListNode.print(oddEvenList2(head));
        }
    }
    

    1.01^{365} ≈ 37.7834343329
    0.99^{365} ≈ 0.02551796445
    相信坚持的力量!

    相关文章

      网友评论

          本文标题:牛客网高频算法题系列-BM14-链表的奇偶重排

          本文链接:https://www.haomeiwen.com/subject/itzsmrtx.html