zoukankan      html  css  js  c++  java
  • [LeetCode] 328. Odd Even Linked List ☆☆☆(奇偶节点分别放一起)

    每天一算:Odd Even Linked List

    描述

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

    请尝试使用原地算法完成。你的算法的空间复杂度应为 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

    说明:

      • 应当保持奇数节点和偶数节点的相对顺序。

      • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

    解析

    这道题给了我们一个链表,让我们分开奇偶节点,所有奇节点在前,偶节点在后。

    • 设定两个虚拟节点,dummyHead1用来保存奇节点,dummyHead2来保存偶节点;

    • 遍历整个原始链表,将奇节点放于dummyHead1中,其余的放置在dummyHead2

    • 遍历结束后,将dummyHead2插入到dummyHead1后面

    代码

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode oddEvenList(ListNode head) {
            if (head == null || head.next == null || head.next.next == null) {
                return head;
            }
    
            ListNode head1 = new ListNode(-1);// 奇数链表
            ListNode head2 = new ListNode(-1);// 偶数链表
            ListNode p = head;
            ListNode p1 = head1;
            ListNode p2 = head2;
            for (int i = 0; p != null; i++) {
                if ((i & 1) == 0) {
                    head1.next = p;
                    head1 = head1.next;
                } else {
                    head2.next = p;
                    head2 = head2.next;
                }
                p = p.next;
            }
            head2.next = null;//偶数链表最后置为null
    
            head1.next = p2.next;
    
            return p1.next;
        }
    }
  • 相关阅读:
    iOS去除导航栏和tabbar的横线
    各种坑
    iOS系统消息
    文件的读写
    MAC机中安装ruby环境--转载
    一句话处理服务器头像的尺寸
    开一个线程来处理 耗时的操作
    angular2中一种换肤实现方案
    一句话说明==和equals的区别
    下拉框样式在不同浏览器的简单兼容
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/11104411.html
Copyright © 2011-2022 走看看