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

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

链表的冒泡排序,

/**

* 链表的冒泡排序

* 排序思路:

* 逐个节点进行排序

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

* 主要是更换了节点的值

* 没有更换节点对象本身

*

* @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

java 链表 排序_基于java的链表冒泡排序和链表有序合并_第1张图片

链表2

java 链表 排序_基于java的链表冒泡排序和链表有序合并_第2张图片

新链表

java 链表 排序_基于java的链表冒泡排序和链表有序合并_第3张图片

你可能感兴趣的:(java,链表,排序)