java实现链表冒泡排序_单链表的冒泡排序

这篇博客介绍了如何使用Java实现单链表的冒泡排序。首先通过带头节点的尾插法构建单链表,然后详细展示了冒泡排序的步骤。博主在九度ACM竞赛中应用此算法对链表进行排序,并给出了样例输入和输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

今天利用空余时间在九度做ACM的时候,需要对单链表进行排序,由于单链表不是随机存取结构,所以我不建议用快速排序,因此采用了冒泡排序!

带头节点的尾插法构建单链表

//初始化带头节点的链表

struct lnode *head, *s, *r, *p;

head = malloc(sizeof(struct lnode));

r = head;

for(i = 0; i < n; i ++)

{

scanf("%d", &d);

s = malloc(sizeof(struct lnode));

s -> data = d;

r -> next = s;

r = s;

}

r -> next = NULL;

冒泡排序——单链表

/**

* Description:单链表的冒泡排序

*/

void BubbleSort(struct lnode *head)

{

struct lnode *f, *p, *x, *y;

f = NULL;

//判断是否只有一个元素或者没有元素

if(head -> next == NULL || head -> next -> next == NULL)

{

return;

}

while(f != head->next->next)

{

//外层是N - 1次循环,升序

for(p = head; p -> next -> next != f; p = p -> next)

{

if(p -> next -> data > p -> next -> next ->data)

{

x = p -> next;

y = p -> next -> next;

p -> next = y;

x -> next = y -> next;

y -> next = x;

}

}

f = p -> next;

}

}

九度ACM遍历链表

题目描述:建立一个升序链表并遍历输出。

输入:输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。

输出:可能有多组测试数据,对于每组数据,

将n个整数建立升序链表,之后遍历链表并输出。

样例输入:4

3 5 7 9

样例输出:3 5 7 9

AC代码:

#include

#include

#include

struct lnode

{

int data;

struct lnode *next;

};

void BubbleSort(struct lnode * head);

int main()

{

int n, i, d;

while(scanf("%d", &n) != EOF)

{

//初始化带头节点的链表

struct lnode *head, *s, *r, *p;

head = malloc(sizeof(struct lnode));

r = head;

for(i = 0; i < n; i ++)

{

scanf("%d", &d);

s = malloc(sizeof(struct lnode));

s -> data = d;

r -> next = s;

r = s;

}

r -> next = NULL;

//冒泡排序

BubbleSort(head);

//打印输出

for(p = head -> next; p != NULL; p = p -> next)

{

if(p -> next == NULL)

{

printf("%d\n", p -> data);

}else

{

printf("%d ", p -> data);

}

}

}

return 0;

}

/**

* Description:单链表的冒泡排序

*/

void BubbleSort(struct lnode *head)

{

struct lnode *f, *p, *x, *y;

f = NULL;

//判断是否只有一个元素或者没有元素

if(head -> next == NULL || head -> next -> next == NULL)

{

return;

}

while(f != head->next->next)

{

for(p = head; p -> next -> next != f; p = p -> next)

{

if(p -> next -> data > p -> next -> next ->data)

{

x = p -> next;

y = p -> next -> next;

p -> next = y;

x -> next = y -> next;

y -> next = x;

}

}

f = p -> next;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值