147 对链表进行插入排序

对链表进行插入排序。

插入排序算法:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

思路:在两个链表上进行操作。一个是原本的链表,再新定义一个链表。对就链表逐个遍历,按照插入排序的方式插入新的链表中。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode insertionSortList(ListNode head) {
        //基本思想:遍历旧链表,插入新链表
        //建立新的链表:只要有个头就可以了
        ListNode newHead = null;
        //在遍历新的链表中没移动一次需要记住前驱
        ListNode pre = null; 
        //旧链表中取出来的待排序的结点
        ListNode wait = null;
        //新链表中和待排序结点比较的当前结点
        ListNode cur = null;
        //考虑输入的链表为空的情况
        if(head == null)
            return null;
        //输入的链表不是空的,就开始遍历并插入新的链表,用while循环比较好,遍历只能从前往后
        while(head!=null){
            wait = head;
            head = head.next;
            wait.next = null;
            if(newHead == null){
                newHead = wait;
            }
            else{
                cur = newHead;
                while(wait.val >= cur.val&&cur.next!=null){
                    pre = cur;
                    cur = cur.next;
                }
                //插在链表的头部
                if(cur==newHead){
                    if(wait.val<cur.val){
                        wait.next = cur;
                        newHead = wait;
                    }
                    else{
                        cur.next = wait;
                    }
                }
                else{
                    //插在链表的尾部
                    if(cur.next==null&&wait.val>=cur.val){
                        cur.next = wait;
                    }
                    else{
                    pre.next = wait;
                    wait.next = cur;
                    }
                }    
            }
        }
            return newHead;
    }
}

总结:这是最笨的一种方法。暴露的问题是你对链表的及其不了解和不熟悉。里面有很多默认的东西以及很多对于完成题目来说的基础的概念和认识需要加强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值