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


    牛客网高频算法题系列-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\)
    相信坚持的力量!

  • 相关阅读:
    Android服务器——TomCat服务器的搭建
    Ubuntu16.04 Liunx下同时安装Anaconda2与Anaconda3
    android中代码操作外部SD卡出错:W/System.err(1595): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
    查准率与查全率(precision and recall) 的个人理解
    Python游戏-实现键盘控制功能
    UGUI世界坐标转换为UI本地坐标(游戏Hud的实现)
    LoadRunner中遭遇交互数据加密的处理方案
    [Java]链表的打印,反转与删除
    优化程序性能(3)——提高并行性
    基本排序算法的python实现
  • 原文地址:https://www.cnblogs.com/kaesar/p/16350717.html
Copyright © 2020-2023  润新知