LeetCode147 对链表进行插入排序

对链表进行插入排序

在这里插入图片描述

l类比数组的插入排序

  • 对每个节点先找到插入的位置
  • 将该节点插入到该位置 (主要就是链表指针的移动)
package CLinkedList;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/10 0010  16:10
 */
public class Problem147 {

    //插入排序
    public ListNode insertionSortList(ListNode head) {

        if(head==null||head.next==null) return head;

        //哨兵节点
        ListNode dummy = new ListNode(-1);
        dummy.next=head;

        ListNode cur = head.next;
        ListNode preCur = head;

        while(cur!=null) {
            //从第一个元素开始进行比较
            ListNode temp = dummy.next;
            //记录这个方便删除
            ListNode preTemp = dummy;
            //寻找插入位置
            while (temp != null) {
                //找到cur还是没有插入位置说明不用动,直接跳出
                if (temp == cur) break;
                //在temp出找到插入位置跳出
                if (temp.val > cur.val) break;
                //不断移动弄指针寻找插入位置
                temp = temp.next;
                preTemp = preTemp.next;
            }

            //需要删除
            if (temp != cur) {
                ListNode cur_next = cur.next;

                //将cur节点插入到temp节点处
                //需要将cur之前的节点直接指向cur.next
                //将cur节点插入到temp节点之前
                //因此需要保存几个节点
                //1、将cur之前的节点指向cur之后的节点将cur节点先解放出来
                preCur.next = cur.next;
                //2、将带插入节点中插入cur节点
                cur.next = temp;
                preTemp.next = cur;
                //遍历下一个节点
                cur = cur_next;
            }else{//不需要删除
                preCur=cur;
                cur=cur.next;
            }
        }
        return dummy.next;
    }


    public static void main(String[] args) {

        ListNode head = new ListNode(6);
        ListNode A = new ListNode(5);
        ListNode B = new ListNode(3);
        ListNode C = new ListNode(7);
        ListNode D = new ListNode(8);
        ListNode E = new ListNode(1);
        ListNode F = new ListNode(2);

        head.next=A;
        A.next=B;
        B.next=C;
//        C.next=D;
//        D.next=E;
//        E.next=F;

        Problem147 problem147 = new Problem147();
        problem147.insertionSortList(head);


    }





}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值