leetcode147:对链表进行插入排序

package com.mxnet;

public class Solution147 {

    public static void main(String[] args) {

    }

    /**
     * Q: 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头
     * @param head
     * @return
     * 思路:
     * 1. 先判断节点是否为空或者是否只有一个元素
     * 2. 定义辅助节点dummyHead让其下一个元素指向head,方便可以在head前插入元素
     * 3. 从第二个节点开始依次扫描节点,寻找当前节点要插入的位置
     * 4. 找到其位置后将其插入
     * 5. 返回dummyHead.next
     */
    public ListNode insertionSortList(ListNode head) {
        //若链表为空或者链表只有一个元素,直接返回head
        if (head == null || head.next == null){
            return head;
        }
        //创建dummyHead链表,让其后一个节点指向head
        ListNode dummyHead = new ListNode();
        dummyHead.next = head;
        //定义辅助指针finalNode指向排好序的链表的最后,默认指向head
        ListNode finalNode = head;
        //定义辅助指针cur保存当前要插入的元素,默认指向head.next
        ListNode cur = head.next;
        while (cur != null){
            if (cur.val >= finalNode.val){
                finalNode = finalNode.next;
            }else {
                //创建辅助指针prev记录当前节点要插入位置的前一个位置
                ListNode prev = dummyHead;
                //从前往后扫描节点,寻找当前节点要插入的位置
                while (prev.next.val <= cur.val){
                    prev = prev.next;
                }
                //找到要插入的位置后将其插入
                //将排好序链表的最后一个元素指向当前节点的下一个元素
                finalNode.next = cur.next;
                //将当前节点进行插入
                cur.next = prev.next;
                prev.next = cur;
            }
            //节点后移,判断下一个节点
            cur = finalNode.next;
        }
        return dummyHead.next;
    }

}
posted @   mx_info  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示