栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CodeTop - 排序奇升偶降链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CodeTop - 排序奇升偶降链表

CodeTop - 排序奇升偶降链表 题目

代码
#include 
#include 
using namespace std; 



typedef struct ListNode{
	int val;
	struct ListNode *next;
}ListNode, *LinkList;

void create(LinkList &head){
	int n;
	cin>>n;
	head = new ListNode;
	head->next = NULL;
	ListNode *tail = head;
	for(int i = 0; i < n; i++){
		ListNode *p = new ListNode;
		cin>>p->val;
		p->next = NULL;
		tail->next = p;
		tail = p;
	}
}

// 拆分奇偶链表 
pair partition(ListNode *head){
	// 奇链表初始化 
	ListNode *oddhead = new ListNode;
	oddhead->next = NULL;
	ListNode *oddtail = oddhead;
	// 偶链表初始化 
	ListNode *evenhead = new ListNode;
	evenhead->next = NULL;
	ListNode *eventail = evenhead;
	int i = 1;  // 记录链表顺序
	while(head){
		ListNode *p = new ListNode;
		p->val = head->val;
		p->next = NULL;
		if(i % 2 == 1){
			oddtail->next = p;
			oddtail = p;
		}else{
			eventail->next = p;
			eventail = p;
		}
		head = head->next;
		i++;
	} 
	oddhead = oddhead->next;
	evenhead = evenhead->next;
	return {oddhead, evenhead};
}

// 反转链表
ListNode* reverseLink(ListNode *head){
	ListNode *pre = NULL;
	ListNode *cur = head;
	while(cur){
		ListNode *temp = cur->next;
		cur->next = pre;
		pre = cur;
		cur = temp;
	}
	return pre;
} 

// 合并链表
ListNode* merge(ListNode *l1, ListNode *l2){
	if(!l1 || !l2){
		return !l1 ? l2 : l1;
	}
	ListNode *head = new ListNode;
	ListNode *h = head;
	while(l1 && l2){
		if(l1->val < l2->val){
			h->next = l1;
			l1 = l1->next; 
		}else{
			h->next = l2;
			l2 = l2->next;
		} 
		h = h->next;
	}
	if(l1){
		h->next = l1;
	}
	if(l2){
		h->next = l2;
	}
	return head->next;
} 

ListNode* sortOddEvenList(ListNode *head){
	if(!head || !head->next){
		return head;
	}
	pair res = partition(head);
	ListNode *odd = res.first;
	ListNode *even = res.second;
	even = reverseLink(even);
	head = merge(odd, even);
	return head;
}

int main(){
	ListNode *head, *res;
	create(head);
	head = head->next;
	res = sortOddEvenList(head);
	while(res){
		cout<val<<" ";
		res = res->next;
	}
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931697.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号