不确定是否有一种简单而更好的方法来实现此功能?
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;
}
}
答案 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)时间之前或之后插入新项目。