zoukankan      html  css  js  c++  java
  • 链表:按照左右半区的方式重新组合单链表

    题目:

    给定一个单链表的头部节点head,链表长度为N,如果N为偶数,那么前 N/2个节点算作半左区,后N/2个节点算右半区;如果N为奇数,那么前N/2为左半区,后半区N/2+1个节点为右半区。左半区从左向右记为 L1->L2->...,右半区从左到右依次记为 R1->R2->...,则链表调整为 L1->R1->L2->R2->....的形式。

    例如:

    分析:

    1. 链表为空或长度为1,直接返回

    2. 长度不为1,遍历链表找到中间节点

    3. 将链表分为左右两个链表,分别记为 left 和 right

    4. 将两个链表按照题目合并起来

     1 class Node
     2 {
     3     public int data;
     4     public Node next;
     5 
     6     public Node(int data)
     7     {
     8         this.data = data;
     9     }
    10 }
    11 
    12 public void relocate(Node head)
    13 {
    14     if(head == null || head.next == null)
    15         return;
    16     Node mid = head, right = head.next;
    17     while(right.next != null || right.next.next != null)
    18     {
    19         mid = mid.next;
    20         right = right.next.next;
    21     }
    22     right = mid.next;
    23     mid.next = null;
    24     mergeLR(head, right);
    25 }
    26 
    27 public void mergeLR(Node left, Node right)
    28 {
    29     Node next = null;
    30     while(left.next != null)
    31     {
    32         next = right.next;
    33         right.next = left.next;
    34         left.next = right;
    35         left = right.next;
    36         right = neext;
    37     }
    38     left.next = right;
    39 }

    参考资料:程序员代码面试指南 IT名企算法与数据结构题目最优解,左程云

  • 相关阅读:
    CF D. Ehab and the Expected XOR Problem 贪心+位运算
    luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队
    Test 1 T2 B 线段树合并
    CF812C Sagheer and Nubian Market 二分+贪心
    CF804B Minimum number of steps
    CF796D Police Stations BFS+染色
    CF796C Bank Hacking 细节
    k8s节点NotReady问题处理
    Elastic-Job快速入门
    Elastic-Job介绍
  • 原文地址:https://www.cnblogs.com/2015110615L/p/6663711.html
Copyright © 2011-2022 走看看