剑指offer 排序的循环链表

题目:

给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal ,使这个列表仍然是循环升序的。

给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。

如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。

如果列表为空(给定的节点是 null),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。

示例:

剑指offer 排序的循环链表_第1张图片

输入:head = [3,4,1], insertVal = 2
输出:[3,4,1,2]
解释:在上图中,有一个包含三个元素的循环有序列表,你获得值为 3 的节点的指针,我们需要向表中插入元素 2 。新插入的节点应该在 1 和 3 之间,插入之后,整个列表如上图所示,最后返回节点 3 。 

 剑指offer 排序的循环链表_第2张图片

 解题思路:

将链表分为三种情况:

1.链表为空链表时,创建新节点,将新节点的next指向自己,再返回这个新节点即可

2.链表节点个数为1时,将头节点的next指向新节点,新节点的next再指向头节点,形成环

3.链表节点个数大于1时,找到新节点需要插入的位置,进行插入,详细说明在源代码处体现

源代码如下:

class Solution {
public:
    Node* insert(Node* head, int insertVal) {
        Node* new_node=new Node(insertVal);//创建新节点
        //当循环链表是空链表时
        if(head==nullptr)
        {
            //直接将新节点的next指向它自己
            new_node->next=new_node;
            return new_node;//返回新节点
        }
        //当循环链表只有一个节点时
        if(head->next==head)
        {
            head->next=new_node;//头节点的next指向新节点
            new_node->next=head;//新节点的next指向头节点,形成环
            return head;//返回头节点
        }
        //循环链表节点数>1的情况,定义双指针
        Node* pre=head;
        Node* cur=head->next;
        //遍历链表,遍历到遇到头节点时停止
        while(cur!=head)
        {
            //新节点的值在pre和cur的值之间,说明找到了要插入的位置了,直接break退出
            if(insertVal>=pre->val&&insertVal<=cur->val)
            {
                break;
            }
            //当前节点的值大于下一个节点的值,说明找到了链表中最大和最小的值
            if(pre->val>cur->val)
            {
                //如果新节点的值大于最大值,那么应该将它插入到pre和cur之间
                //如果新节点的值小于最小值,那么应该将它插入到pre和cur之间
                if(insertVal>pre->val||insertValval)
                {
                    break;
                }
            }
            pre=pre->next;//更新pre指针
            cur=cur->next;//更新cur指针
        }
        //找到应该插入的位置后,将pre的next指向新节点
        ///新节点的next指向cur,就插入成功了
        pre->next=new_node;
        new_node->next=cur;
        //返回头节点即可
        return head;
    }
};

如果while循环结束,还是没有找到应该插入的位置,说明该链表上的所有节点的值相同,那么此时就在最后插入新节点即可,不会破坏升序的顺序。

你可能感兴趣的:(链表,数据结构,leetcode,c++)