算法打卡日志-2020.11.20| LeetCode147

题目 147. 对链表进行插入排序

这是一道链表题,解题思路较简单,就是遍历,再从头到尾查找合适的位置插入,但是实际实现时,有很多坑,这些也是链表问题需要仔细注意的,建议画示意图来辅助解题。

虽然思路简单但是Coding时也很坑,最繁琐的就是插入时的过程了,建议通过画图的方式来进行分析。最常见的问题就是指针丢失,本题中,三个坑都是指针丢失的问题,其中坑1和坑2容易发现,坑3是最容易忽视的。

public ListNode insertionSortList(ListNode head) {
    //空表处理,虽然不一定有用,但是是一个良好的习惯
    if (head==null||head.next==null){
        return head;
    }
    //哨兵头节点,减少可能出现的错误
    ListNode guardHead=new ListNode(0,head);
    //已排序的最后一个节点
    ListNode tailNode=guardHead;
    //当前正在处理的节点
    ListNode currNode=head;
    //下一个要处理的节点
    ListNode nextNode=null;
    while(currNode!=null){
        //查找插入位置
        ListNode eNode=guardHead;
        nextNode=currNode.next;//坑1:下一节点丢失
        while(eNode!=null&&eNode.next!=null){
            //这个判断是为了处理第一个数据时的尾节点
            if (eNode.next==currNode){
                tailNode=tailNode.next;
                break;
            }
            if (currNode.val>eNode.next.val){
                eNode=eNode.next;
            }else {
                ListNode tmp=eNode.next;//坑2:后续节点丢失
                eNode.next=currNode;
                currNode.next=tmp;
                tailNode.next=nextNode;//坑3:已排序的尾节点没能正确连接下一节点
                break;
            }
        }
        currNode=nextNode;

    }
    return guardHead.next;
}
posted @ 2020-11-20 19:12  PPPPu  阅读(76)  评论(0)    收藏  举报