设计一个算法将所有小于零的结点移到所有大于等于零的结点的前面

【问题描述】

某非空单链表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);
}

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 该问题描述如下:给定一个非空单链表l,其所有元素均为整数,设计一个算法将所有小于结点移动到所有大于等于零结点之前。 解法:可以使用两个指针,一个指向头结点,另一个指向当前结点。遍历整个链表,如果当前结点元素小于,则将当前结点链表删除并移动到头结点的位置。否则,继续遍历下一个结点,直到遍历完整个链表。最终,所有小于结点都会移动到所有大于等于零结点之前。 ### 回答2: 这道题目考察的是对单链表的操作和基本算法思路的掌握,比较常见的解决方法是利用两个指针来遍历单链表,并将小于结点插入到另一个链表,最后将两个链表拼接起来。 具体步骤如下: 1. 创建两个指针p和q,分别指向链表的头结点和尾结点,以便遍历整个链表; 2. 创建两个新链表neg和pos,分别用于存储小于大于等于零结点; 3. 遍历整个链表,如果当前结点小于,就将它插入到neg链表的尾部;否则,将它插入到pos链表的尾部; 4. 遍历完整个链表后,将neg链表的尾部指向pos链表的头部,即可将所有小于结点移到所有大于等于零结点前面。 具体实现过程如下: ``` typedef struct Node{ int data; struct Node* next; }Node; void move(Node* l){ Node *p = l->next, *q = l; Node *neg = (Node *)malloc(sizeof(Node)), *pos = (Node *)malloc(sizeof(Node)); Node *p1 = neg, *p2 = pos; while(p != NULL){ if(p->data < 0){ p1->next = p; p1 = p1->next; } else{ p2->next = p; p2 = p2->next; } p = p->next; } p1->next = pos->next; p2->next = NULL; q->next = neg->next; free(neg); free(pos); } ``` 该算法时间复杂度为O(n),空间复杂度为O(1)。 ### 回答3: 这道题目可以采用分治的思想来解决。我们可以遍历一遍非空单链表,将所有小于结点单独提出来,形成一个新的链表。同理,将大于等于零结点也单独提出来,形成另一个链表。最后再将这两个链表相连接。 具体实现步骤如下: 1. 定义三个指针,分别为head指向原链表的头结点,negative指向所有小于结点的头结点,positive指向所有大于等于零结点的头结点。 2. 遍历原链表,根据结点的值将其插入对应的链表。 a. 如果结点的值小于,就插入到negative链表。 b. 如果结点的值大于等于零,就插入到positive链表。 3. 遍历完链表后,将negative链表的最后一个结点的next指针指向positive链表的头结点,即将两个链表拼接起来。 4. 最后返回negative链表的头结点即可。 算法的时间复杂度为O(n),空间复杂度为O(1),因为只需定义三个指针来进行链表操作,不需额外的空间。该算法简洁明了,易于理解和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值