LeetCode 147——对链表进行插入排序

一、题目介绍

对链表进行插入排序。

插入排序算法:

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

二、解题思路

        因为题目给的链表结构为单链表,所以进行插入的时候没办法从后向前遍历,因此当检测到当前节点的值大于前一节点时,就从前向后遍历找到第一个小于当前节点的节点,再执行插入。在插入的过程中需要处理好如下关系:

(1)当前节点pNode的前一节点preNode指向其后一节点,即preNode->next = pNode->next。

(2)当前节点指向被插入节点pTemp,即pNode->next = pTemp。

(3)被插入节点的前一节点p不为空的前提下,指向当前节点,p->next = pNode;

(4)如果被插入节点为头结点head,插入完成之后,需要更新头结点。

三、解题代码

/**
 * 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 head;
        ListNode* pNode = head;
        ListNode* preNode = NULL;
        while(pNode)
        {
            if(preNode && pNode->val < preNode->val)
            {
                ListNode* pTemp = head;
                ListNode* p = NULL;
                while(pTemp != pNode)
                {
                    if(pTemp->val > pNode->val)
                    {
                        preNode->next = pNode->next; //前一个节点指向后一个节点
                        pNode->next = pTemp;//移动的节点指向被插入的节点
                        if(p)//被插入节点的前一个节点指向插入的节点
                            p->next = pNode;
                        if(pTemp == head) //更新头结点
                            head = pNode;
                        pNode = preNode;
                        break;
                    }
                    p = pTemp;
                    pTemp = pTemp->next;
                }
            }
            preNode = pNode;
            pNode = pNode->next;
        }
        return head;
    }
};

四、解题结果

猜你喜欢

转载自blog.csdn.net/qq_39661206/article/details/109844117