147. 对链表进行插入排序

问题

对链表进行插入排序。
在这里插入图片描述
例子

在这里插入图片描述

思路

  • 方法1

    用指针sorted指向已经排序的最后一个位置
    因为要插入,所有需要头结点和一个pre指针
    >

  • 方法2

代码

//方法1
class Solution {
    public ListNode insertionSortList(ListNode head) {
        if(head==null || head.next==null) return head;
        ListNode h = new ListNode(-1);
        h.next = head;
        ListNode sorted = head;
        ListNode pre = null;
        while(sorted!=null && sorted.next!=null) { 
            if(sorted.val<=sorted.next.val) {
                sorted = sorted.next;
                continue;
            }
            pre = h;
            while(pre.next.val<=sorted.next.val) pre = pre.next;
            
            ListNode deal = sorted.next;
            sorted.next = sorted.next.next;
            deal.next = pre.next;
            pre.next = deal;
            
        }
        return h.next;
           

    }
}
//方法2

链表插入排序是一种对链表进行排序的算法,其基本思想是将链表分为已排序和未排序两部分,每次从未排序部分取出一个节点,插入到已排序部分的合适位置。以下是几种不同语言实现链表插入排序的方法: ### Java实现 ```java /** * 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 dummy = new ListNode(Integer.MIN_VALUE); ListNode cur = head; ListNode p = null; while(cur != null){ ListNode after = cur.next; p = dummy; while(p.next != null && p.next.val < cur.val){ p = p.next; } cur.next = p.next; p.next = cur; cur = after; } return dummy.next; } } ``` 此方法新建一个含虚拟节点的链表,然后遍历给定的链表,依次将节点插入到新建链表的合适位置 [^1]。 ### C++实现 ```cpp /** * 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; ListNode* list1,*list2,*p,*q,*r; list1=head->next; while(list1){ p=list1; list2=head; while(list2!=p){ if(p->val<=list2->val) break; list2=list2->next; } if(p!=list2){//insert sort q=list2; r=head; while(r->next!=list2&&list2!=head) r=r->next; while(q->next!=p) q=q->next; if(list2==head){ q->next=p->next; p->next=list2; head=p; } else { r->next=p; q->next=p->next; p->next=list2; } list1=q->next; } else{ list1=list1->next; } } return head; } }; ``` 该方法通过遍历链表,将未排序部分的节点插入到已排序部分的合适位置 [^2]。 ### C实现 ```c // 假设 link 是链表节点的类型定义 void InsertionSort(link h) { link h1,h2,h3; /*h2用来指向需要插入的结点,h3用来指向h2的前一个结点*/ for(h3=h,h2=h->next;h2!=NULL;) { h1=h; /*h1用来遍历寻找合适的插入位置*/ for(;h1!=h2;h1=h1->next) { if(h1->next->item > h2->item) /*如果找到,即把h2所指向的结点插到h1后面,然后跳出循环*/ { h3->next=h2->next; h2->next=h1->next; h1->next=h2; h2=h3->next; break; /*别忘了此处的break*/ } } if(h1==h2) /*此处需要注意,只在h2所指结点不需要前插时,移动h2和h3*/ { h2=h2->next; h3=h3->next; } } } ``` 此方法通过指针操作,将链表节点插入到合适位置以完成排序 [^3]。 ### 入口函数示例(C语言) ```c //入口函数 void main() { node_t * pstHead = NULL; initList(&pstHead);//初始化链表 printf("pai qian /n"); showList(pstHead);//打印元素 insert_sort(pstHead);//插入排序 printf("pai hou/n"); showList(pstHead); destroyList(pstHead); pstHead = NULL; } ``` 该入口函数展示了链表初始化、排序、打印和销毁的过程 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值