《剑指 Offer》专项突破版 - 面试题 29 : 排序的循环链表(C++ 实现)

题目链接:LCR 029. 循环有序列表的插入 - 力扣(LeetCode)

题目

在一个循环链表中节点的值非递减排序,请设计一个算法在该循环链表中插入节点,并保证插入节点之后的循环链表仍然是排序的。

分析

在排序的循环链表中插入新节点的规则:先试图在链表中找到相邻的两个节点,如果这两个节点的前一个节点的值小于或等于(<=)待插入的值,并且后一个节点的值大于或等于(>=)待插入的值,那么就将新节点插入这两个节点之间。如果找不到符合条件的两个节点,即待插入的值大于等于链表中已有的最大值或小于等于已有的最小值,那么新的节点将被插入值最大的节点和值最小的节点之间

在上面的规则中,总是先试图从链表中找到符合条件的相邻的两个节点。如果开始的时候链表中的节点数小于 2,那么应该有两种可能。第 1 种可能是最开始的时候链表是空的,一个节点都没有,此时插入一个新的节点,该节点成为循环链表中的唯一节点,那么 next 指针指向节点自己。第 2 种可能是开始的时候链表中只有一个节点,插入一个新的节点之后,两个节点的 next 指针互相指向对方

代码实现

class Solution {
public:
    Node* insert(Node* head, int insertVal) {
        Node* newNode = new Node(insertVal);
        if (head == nullptr)
        {
            newNode->next = newNode;
            return newNode;
        }
        if (head->next == head) 
        {
            head->next = newNode;
            newNode->next = head;
            return head;
        }
​
        Node* cur = head;
        Node* next = cur->next;
        Node* biggest = cur;
        while (next != head && !(cur->val <= insertVal && next->val >= insertVal))
        {
            cur = next;
            next = next->next;
            if (cur->val >= biggest->val)
                biggest = cur;
        }
        if (cur->val <= insertVal && next->val >= insertVal)
        {
            cur->next = newNode;
            newNode->next = next;
        }
        else
        {
            newNode->next = biggest->next;
            biggest->next = newNode;
        }
        return head;
    }
};

你可能感兴趣的:(数据结构,链表,c++,数据结构,面试,leetcode,算法,开发语言)