Sort a linked list using insertion sort.

本文介绍了一种使用插入排序算法对链表进行排序的方法。通过逐步将旧链表中的元素插入到新链表的适当位置来实现排序过程。文章详细解释了插入排序的基本思想,并提供了具体的实现步骤。

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

题录:

Sort a linked list using insertion sort.

分析如下:

使用插入排序的方法,对一个链表进行排序。
插入排序的思想:第i个元素插入到已排序的前i-1个元素中。
注意
1 排好序的新链表和旧链表要断开。
2 什么叫做插入排序,从A[1]到A[n],依次把旧链表中的旧元素放入新链表的正确位置中,新链表是从没有元素开始逐渐排好序的,每加入一个旧元素,就把它放入正确的位置中。有三种可能的位置,新链表的表头,新链表的表中,新链表的表尾,因为在不同的位置会造成对head指针做不同的处理,所以需要分情况讨论。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode insertionSortList(ListNode head) {
        //链表为空,直接返回null
        if(head == null)
            return head;
        //旧链表从头结点的下一个结点开始遍历
        ListNode curr = head.next;
        //新链表中从含有一个元素开始,也就是旧链表的头结点
        ListNode newHead = head;
        //断开旧链表和新链表
        head.next = null;

        ListNode nCurr = head;
        while(curr != null){
            ListNode prev = null;
            //每次新插入结点,新链表从头结点开始遍历
            nCurr = head;
            //新链表没有遍历结束并且旧链表结点大于新链表的结点,新链表继续向后遍历
            while(nCurr != null && curr.val >= nCurr.val){
                prev = nCurr;
                nCurr = nCurr.next;
            }
            //记录当前要插入的旧链表中的结点
            ListNode p = curr;
            //旧链表中结点后移,即与要插入的结点断开
            curr = curr.next;
            p.next = nCurr;
            //新插入结点不是新链表头结点,则prev指针不为空,修改其next指向当前新插入的结点
            if(prev != null){
                prev.next = p;
            }else{   //考虑如果插入的是新链表的头结点,则令head指向新结点
                head = p;
            }
        }
        return head;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值