首页 > 试题广场 >

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

[编程题]按照左右半区的方式重新组合单链表
  • 热度指数:852 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个单链表的头部节点head,链表长度为N。 如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区; 如果N为奇数,那么前N/2个节点算作左半区,后N/2+1个节点算作右半区; 左半区从左到右依次记为L1->L2->...,右半区从左到右依次记为R1->R2->...。请将单链表调整成L1->R1->L2->R2->...的样子。 例如: 1->2->3->4 调整后:1->3->2->4 1->2->3->4->5 调整后:1->3->2->4->5 要求:如果链表长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1)

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
public class Solution {
	/**
	 *	按照左右半区的方式重新组合单链表
	 *	输入:一个单链表的头节点head
	 *	将链表调整成题目要求的样子
	 *
	 *	后台的单链表节点类如下:
	 *
	 public class ListNode {
		int val;
		ListNode next = null;

		ListNode(int val) {
			this.val = val;
		}
	}
	 */
    public static void relocateList(ListNode head) {
        //1.快慢指针找到中间点
        ListNode hh = new ListNode(-1);//没分清“头部节点”的补救措施
        hh.next = head;
        ListNode l1,lmid,locate;//locate定位节点
        l1 = hh;
        lmid = hh;
        int length = 0;
        for(;l1.next!=null;l1 = l1.next){
            length++;
            if(length%2 == 0)
                lmid = lmid.next;
        }

        if(length > 3) {
            locate = lmid;
            lmid = lmid.next;//lmid及以后的都是R
            locate.next = null;
            l1 = hh.next;

            while (l1 != null) {
                locate = l1;
                l1 = l1.next;
                locate.next = lmid;
                locate = lmid;

                if (l1 != null) {
                    lmid = lmid.next;
                    locate.next = l1;
                }

            }
        }
    }
}
反正过了。。。
发表于 2016-09-23 11:56:06 回复(0)