zoukankan      html  css  js  c++  java
  • LeetCode_Insertion Sort List

    题目:Sort a linked list using insertion sort,即仿照插入排序(直接插入排序)对一个链表排序。

    插入排序的思想:总共进行n-1趟排序,在排列第i个元素时,前面的i个元素是有序的,将第i个元素插入到前i个元素中,并且保证被插入的数组是有序的,数组是顺序存储的,因此向有序的数组插入一个元素时,需要从插入位置之后的各个元素后移。这就是插入排序的思想。插入排序的时间复杂度O(n^2),是稳定的排序方法。链表并不是顺序存储,因此,再将第i个节点插入到前i个节点,并保证有序时,需要指针的复杂运算。

    要判断一次插入是否是插入到链表的最前方,因为这样会有head指针的变化。插入时,需要找到插入位置,且找到插入位置的前驱节点,找到并且找到待插节点的前驱。这个题目本身不难,但是花了好长时间,终于AC,思路值得记下来,也许到了用的上的时候就写不出来了,常看看。。。。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *insertionSortList(ListNode *head) {
             if(head == NULL) return NULL;
             if(head->next==NULL) return head;
            // ListNode *p = head;
             ListNode *q = head->next;
             while(q!=NULL)
             {
                  ListNode *f = head;
                  while(f!=q)
                  {
                       if(q->val < f->val)
                       {
                                 ListNode *qf = f;
                                 while(qf->next!=q)
                                 {
                                     qf = qf->next;
                                 }//找到q的前驱节点
                                 if(f==head)
                                 {
                                 head = q;
                                 qf->next = q->next;
                                 q->next = f; 
                                 q = qf->next;
                                 }
                                 else
                                 {
                                 ListNode *p = head;
                                 while(p->next!=f)
                                 {
                                 p = p->next;
                                 }//找到待插入节点的前驱
                                 qf->next = q->next;
                                 q->next = f; 
                                 p->next = q;
                                 q = qf->next;
                                 }
                                 break;
                       }
                       else 
                       {
                            f = f->next;
                       }
                  }
                  if(f==q)
                  q=q->next;
             }
             return head;
        }
    };



  • 相关阅读:
    linux学习笔记
    随笔
    matlab自学笔记(3)—图像绘制与图像处理
    matlab自学笔记(1)安装与简介
    matlab自学笔记(2)函数的使用
    四轴飞行器
    小学生300道练习题程序及问题
    对运动软件——乐动力的评价
    软件工程随记
    Visual Studio 2013版本安装
  • 原文地址:https://www.cnblogs.com/sunp823/p/5601445.html
Copyright © 2011-2022 走看看