链表:按照左右半区的方式重新组合单链表
题目:
给定一个单链表的头部节点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名企算法与数据结构题目最优解,左程云
posted on 2016-08-03 21:34 Traveling_Light_CC 阅读(285) 评论(0) 编辑 收藏 举报