Reorder List

/*
 * Solution.cpp
 *
 *  Created on: 2014年4月9日
 *      Author: William
 */

#include <iostream>
using namespace std;

// Definition for singly-linked list.
struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};

class Solution {
public:
	// The important part of this problem is to make the reverse function O(n) instead of O(n2).
	ListNode* reverseList(ListNode* head) {
		if (head == NULL || head->next == NULL)
			return head;
		ListNode* tmphead = reverseList(head->next);
		head->next->next = head;
		head->next = NULL;
		return tmphead;
	}

	void reorderList(ListNode *head) {
		// Find the mid point.
		int size = 0;
		ListNode *tail = head, *mid = head;
		while (tail != NULL) {
			tail = tail->next;
			size++;
		}
		if (size < 3)
			return;
		for (int i = 0; i < size / 2; i++)
			mid = mid->next;
		// reverse the last half.
		ListNode *rest = mid->next;
		rest = reverseList(rest);
		mid->next = rest;
		// Reorder
		ListNode *p = head, *cur = mid;
		while (rest != NULL) {
			cur->next = rest->next;
			rest->next = p->next;
			p->next = rest;
			p = p->next->next;
			rest = cur->next;
		}
	}

	void printList(ListNode *head) {
		ListNode *p = head;
		while (p != NULL) {
			cout << p->val << " ";
			p = p->next;
		}
		cout << endl;
	}
};

int main() {
	Solution pro;
	ListNode l1 = ListNode(1);
	ListNode l2 = ListNode(2);
	l1.next = &l2;
	ListNode l3 = ListNode(3);
	l2.next = &l3;
	ListNode l4 = ListNode(4);
	l3.next = &l4;
	ListNode l5 = ListNode(5);
	l4.next = &l5;
	ListNode l6 = ListNode(6);
	l5.next = &l6;
	ListNode l7 = ListNode(7);
	l6.next = &l7;
	pro.printList(&l1);
	pro.reorderList(&l1);
	pro.printList(&l1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值