创建一个函数以在给定位置将元素插入List

时间:2018-06-07 04:47:17

标签: c++ linked-list

不确定是否有一种简单而更好的方法来实现此功能?

void insert(Node* &head, int element, int position) {
    Node* current = new Node;
    current->data = element;
    current->next = NULL;

    if (position == 1) {
        current->next = head;
        head = current;
        return;
    }
    else {
        Node * current2 = head;
        for (int i = 0; i < position - 2; i++) {
            current2 = current2->next;
        }
        current2->next = current2->next;
        current2->next = current;
    }
} 

2 个答案:

答案 0 :(得分:0)

需要进行一些边界检查(请查看内联评论):

int listLen(Node *head)
{
    int len = 0;
    while (head != nullptr)
    {
        len++;
        head = head->next;
    }
    return len;
}

void insert(Node* &head, int element, int position)
{
    if (head == nullptr)    // do nothing if head is nullptr
        return;

    if (position < 0)   // insert to the begin if position is negative
        position = 0;
    else
    {
        int len = listLen(head);
        if (len < position)   // position is out of range, insert to the end
        {
            position = len;
        }
    }

    if (position == 0)
    {
        Node *next = head;
        head = new Node(element);
        head->next = next;
    }
    else
    {
        int curPos = 0;
        Node *curNode = head;
        while (curPos < position - 1)   // move to position
        {
            curNode = curNode->next;
            curPos++;
        }

        Node *next = curNode->next;    // do insertion
        curNode->next = new Node(element);
        curNode->next->next = next;
    }
}

答案 1 :(得分:0)

更好的方法是在没有空指针访问的情况下创建此函数。您缺少所有必要的错误检查。

但如果你必须使用这个功能,你已经做错了。该操作需要O(n)时间。如果你只使用这个函数构建列表,那么你已经有了O(n ^ 2)时间。使用平衡的树或堆会给你O(n * log n)时间,即使相对较小的n也会产生巨大的差异。因此,再想一想为什么需要在给定位置插入并考虑更合适的数据结构。

一个更简单的实现,实际上在实际代码中实际使用的是使用双向链表实现<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" rel="stylesheet" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script> <div class="container" ng-app="breakColumn"> <div class="row" ng-controller="MainCtrl"> <div class="col bg-primary p-4 mb-3" ng-repeat-start="item in list track by $index" ng-init="itemIndex = $index"> {{item}} </div> <!-- break column --> <div class="w-100" ng-repeat-end ng-if="(itemIndex +1) % 5 === 0"></div> </div> </div>insert_before(before, data)。这两个都将获得列表中的项目和一个新项目,以便在O(1)时间之前或之后插入新项目。