📅  最后修改于: 2023-12-03 15:22:36.284000             🧑  作者: Mango
冒泡排序是一种基本的排序算法,是通过比较相邻元素大小来交换位置的排序算法。而链表是一种常用的数据结构。将冒泡排序与链表结合起来,可以实现链表中元素按大小排序的功能。
冒泡排序的基本思路是:比较相邻的元素。如果第一个比第二个大,就交换它们两个;否则不交换。对于所有相邻的元素对,重复以上步骤,直到没有任何一对元素需要交换位置为止。
而对于链表,我们可以使用头插法来将元素插入到一个新的有序链表中。具体操作为,每次将未排序链表的第一个元素与有序链表中的元素比较大小,然后插入到正确的位置上,重复这个过程直到未排序链表为空。
public static ListNode bubbleSortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = new ListNode(0);
newHead.next = head;
ListNode lastExchange = head;
ListNode tail = null;// 有序链表的尾指针
while (lastExchange != null) {
ListNode cur = newHead.next;
ListNode pre = newHead;
lastExchange = null;
while (cur.next != null) {
if (cur.val > cur.next.val) {
pre.next = cur.next;
cur.next = cur.next.next;
pre.next.next = cur;
lastExchange = cur;
}
pre = pre.next;
cur = cur.next;
if (lastExchange == null) {
tail = cur;
}
}
}
return newHead.next;
}
其中,ListNode
是一个定义好的链表节点类,结构如下所示:
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
时间复杂度:O(N^2),其中 N 是链表的长度。对于链表,每次比较都需要遍历链表的长度,一共需要进行 N 次比较,因此时间复杂度为 O(N^2)。
空间复杂度:O(1),没有使用额外的空间,只需要用一个临时变量来交换节点的位置。