链表:按照左右半区的方式重新组合单链表

题目:

给定一个单链表的头部节点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名企算法与数据结构题目最优解,左程云

原文地址:https://www.cnblogs.com/2015110615L/p/6663711.html