java 链表 排序_基于java的链表冒泡排序和链表有序合并

该博客介绍了如何使用Java实现链表的冒泡排序以及两种方式(循环和递归)来合并两个有序链表,形成一个单调递增的新链表。首先,展示了链表冒泡排序的详细步骤,然后通过循环和递归方法完成链表的有序合并。
摘要由CSDN通过智能技术生成

链表排序是链表有序合并的前提,所以就放在一起写了

链表的冒泡排序,

/**

* 链表的冒泡排序

* 排序思路:

* 逐个节点进行排序

* 把当前节点和下个节点的值进行比较,根据结果处理

* 主要是更换了节点的值

* 没有更换节点对象本身

*

* @param head

* @return

*/

static LinearList bubbleSort(LinearList head) {

//判断链表是否需要排序

if (head == null || head.nextNode == null) {

return null;

}

//保存入参头节点的引用

LinearList temp = head;

/**

* 尾部节点,是循环截止节点

*/

LinearList tail = null;

int in = 0;

/**

* 外部遍历是遍历每个节点

*/

while(head.nextNode != tail) {

/**

* 内部遍历是把当前冒泡的节点进行逐个比较

*/

while (head.nextNode != tail) {

//互换节点的值

if (head.i > head.nextNode.i) {

in = head.i;

head.i = head.nextNode.i;

head.nextNode.i = in;

}

//指针下移一位

head = head.nextNode;

}

/**

* tail作为遍历截止节点

* 内部循环结束一次则成功把一个数放到它合适的位置,下次遍历不需要再遍历到已经排好位置的这个数

* tail既是作为已经最后一个排好序的节点的引用

*/

tail = head;

//指针重新回到链表头部

head = temp;

}

return head;

}

循环方式完成两条链表有序合并

/**

* 循环方式

* 把两条两边合并为一条单调递增链表

*

* @param head

* @param head1

* @return

*/

static LinearList merge(LinearList head,LinearList head1){

/**

* 声明两个链表节点实例

* 分别保存两条链表排序后的头节点

*/

LinearList temp = null,temp1 = null;

/**

* 对两条链表进行排序

*/

temp = bubbleSort(head);

temp1 = bubbleSort(head1);

LinearList megre = null;

/**

*

* 声明合并后的链表的头节点

* 作为作为返回值

*/

LinearList megre1 = null;

/**

* 比较两条链表的头节点

* 确定谁的头节点作为合并后链表的头节点

*/

if(temp.i>temp1.i){

megre = temp1;

temp1 = temp1.nextNode;

megre1 = megre;

}else{

megre = temp;

temp = temp.nextNode;

megre1 = megre;

}

/**

* 循环中一次对比两条链表指针所对应的节点的值

* 值小的插入新链表中

*/

while(temp != null || temp1 != null){

System.out.println("----------");

if(temp.i>temp1.i){

megre.nextNode = temp1;

temp1 = temp1.nextNode;

megre = megre.nextNode;

/**

* 如果再此次插入新链表的操作指针下移后

* temp1 节点所对应的链表已经没有下一个节点了

* 则把排序好的另一条链表的剩余部分直接插入新链表的下个节点

* 下面同理

*/

if(temp1 == null){

megre.nextNode = temp;

// 组合完毕 跳出循环

break;

}

}else{

megre.nextNode = temp;

temp = temp.nextNode;

megre = megre.nextNode;

if(temp == null){

megre.nextNode = temp1;

break;

}

}

}

//返回合并后新链表的头节点

return megre1;

}

递归方式完成链表的有序合并

因为排序不需要写进递归排序方法内,所以在调用递归合并方法前对两条链表进行排序

LinearList temp = Utils.bubbleSort(linearList);

LinearList temp1 = Utils.bubbleSort(linearList1);

linearList2 = Utils.merge1(temp,temp1);

接下来是递归合并方法

/**

* 递归方式

* 把链条两边合并成一条单调递增的链表

* ps:因为排序不需要递归,所以再调用本方法前就进行排序

* @param head1

* @param head2

* @return

*/

static LinearList merge1(LinearList head1,LinearList head2){

/**

* 递归结束的标志

* 其中一条链表没了就把另一条链表剩余部分接到新链表后面去

*/

if(head1 == null) {

return head2;

}

if (head2 == null){

return head1;

}

/**

* 声明两个链表节点实例

* 分别保存两条链表排序后的头节点

*/

LinearList temp1 = null,temp2 = null;

/**

* 对两条链表进行排序

*/

temp1 = head1;

temp2 = head2;

//声明一个新链表头节点

LinearList merge = new LinearList();

/**

* 比较链表1和链表2的值的大小

* 值小的则插入新链表

* 递归调用本方法,参数中节点插入新链表的链表指针下移一位

* 返回值赋值给新链表新插入节点的下一节点

*/

if(temp1.i>temp2.i){

merge = temp2;

merge.nextNode = merge1(temp1,temp2.nextNode);

}else{

merge = temp1;

merge.nextNode = merge1(temp1.nextNode,temp2);

}

return merge;

}

实现结果

链表1

c794820a4437617dc8c485a135a5b3e5.png

链表2

8cc1a00fbd4629a3fef0f90e523779ff.png

新链表

f2547e090dc61db2634f93d844d6cde0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值