【问题描述】

某非空单链表L中的所有元素为整数,设计一个算法将所有小于零的结点移到所有大于等于零的结点的前面。

【输入形式】

两行,第一行是整数个数,第二行是整数列表

【输出形式】

整数列表
【样例输入】

6

-1 2 3 -3 -5 6

【样例输出】

-5 -3 -1 2 3 6

【样例说明】

将小于0的整数插入到头部位置
【评分标准】

必须使用单链表

多写了一个排序的功能,就这样吧。

#include<iostream>
using namespace std;

struct node {
	int data;
	node* next;
};

node* create(int size) {
	node* head = new node; head->next = NULL;
	node* p = head; node* q = NULL;
	for (int i = 0; i < size; i++) {
		q = new node;
		cin >> q->data;
		q->next = NULL;
		p->next = q;
		p = q;
	}
	return head;
}

//排序,从小到大,n为链表长度
void sort(node* L,int n) {
	int z;
	for(int i=0;i<n;i++){
		node* p = L->next; node* q = p->next;
		while (q!= NULL) {
			if (p->data > q->data) {
				z = p->data;
				p->data = q->data;
				q->data = z;
			}
			p = p->next;
			q = q->next;
		}
	}
}

//将负数平移到正数左边
void sort2(node* L,int n) {
	//L1存放负数
	node* L1 = new node; L1->next = NULL;
	//L2存放正数
	node* L2 = new node; L2->next = NULL; node* y = L2;
	node* p = L->next;
	//临时节点
	node* q = NULL;
	//拆分
	while (p != NULL) {
		if (p->data < 0) {
			q = new node;
			q->data = p->data;
			q->next = L1->next;
			L1->next = q;
		}
		else {
			q = new node;
			q->data = p->data;
			q->next = NULL;
			y->next = q;
			y = q;
		}
		p = p->next;
	}
	//合并
	p = L->next;
	node* x2 = L1->next;
	node* y2 = L2->next;
	for (int i = 0; i < n; i++) {
		if (x2 != NULL) {
			if (p) {
				p->data = x2->data;
				x2 = x2->next;
				p = p->next;
			}
		}
		else {
			if (p) {
				p->data = y2->data;
				y2 = y2->next;
				p = p->next;
			}
		}
	}

}

//遍历
void print(node* L) {
	node* p = L->next;
	while (p != NULL) {
		cout << p->data<<" ";
		p = p->next;
	}
}

int main() {
	node* L;
	int n;
	cin >> n;
	L = create(n);
	sort2(L,n);
	cout << endl;
	print(L);
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐