【问题标题】:Inserting a node in nth position in a linked list在链表的第 n 个位置插入一个节点
【发布时间】:2019-01-15 18:06:43
【问题描述】:
#include<iostream>
using namespace std;

struct node {
    int data;
    node *link;
};
node *head = NULL;

void insert(int data, int n)
{
    node *temp = new node();
    temp->data = data;

    if (n == 1)
    {
        temp->link = head;
        head = temp;
    }

    else 
    {
        node* ptr = head;
        for (int i = 1; i <= n - 1; i++)
            ptr = ptr->link;
        temp->link = ptr->link;
        ptr->link = temp;
    }
}

void print()
{
    cout << "list is: ";
    node *temp = head;
    while (temp != NULL)
    {
        cout << temp->data << " ";
        temp = temp->link;
    }
    cout << endl;
}

int main()
{
    insert(2, 1);
    insert(3, 2);
    insert(4, 3);
    insert(5, 4);
    insert(6, 5);

    print();
    return 0;
}

这是在第 n 个位置实现插入链表的代码。数据和位置是从主位置传递过来的。

我不知道我可能犯了什么错误,它与for loop 有关。

它没有执行,但是如果我进行以下更改:

for(int i=0;i<n-2;i++)

效果很好。

【问题讨论】:

  • 在调试器中启动程序的完美点,逐行检查代码并检查到底发生了什么。
  • 您应该在取消引用之前检查 ptr 是否为空。
  • 如果你需要插入到第 n 个位置,那么很可能你不应该使用链表
  • 你没有问问题。如果对给定的更改“它工作正常”,为什么首先要问一个?你不明白所做的改变吗?如果没有,你为什么做到?意大利面条式编程(随意往墙上扔面条,希望最终能粘住)并没有真正的好处。
  • 你泄漏了你分配的所有内存。

标签: c++ data-structures linked-list singly-linked-list


【解决方案1】:

首先insert(2,1) 工作正常。所以你有这样的链表

(2)->NULL
 |
head

在第二个插入中,让我们跟随代码,

1. else 
2. {
3.    node* ptr = head;
4.    for (int i = 1; i <= n - 1; i++)
5.        ptr = ptr->link;
6.    temp->link = ptr->link;
7.    ptr->link = temp;
8. }

第 3 行,ptr 指向 headn 是 2

(2)->NULL
 |
head
 |
ptr

第 4 行,1 &lt;= (2-1)true,因为 1 == 1,所以 for 循环运行一次

第5行,ptr移动了一步,所以它指向NULL

(2)->NULL
 |    |
head  |
      |
     ptr

第 6 行,ptr-&gt;link 被调用,即NULL-&gt;link。所以它在这里崩溃了。


当你做for(int i=0;i&lt;n-2;i++)时,n是2,所以0 &lt; (2-2)false,所以它运行良好。注意:仅当像您的示例一样按顺序进行插入调用时才有效。如果以错误的顺序调用它们,它将不起作用。

将第 6 行更改为 temp-&gt;link = ptr;,也应该在不更改循环的情况下工作。

【讨论】:

    【解决方案2】:

    “在链表的第n个位置插入一个节点”:

    使用std::list 而不是自己滚动。然后使用std::list::insert

    还有;考虑只使用std:: vector。列表是一种在现代 CPU 上使用的可怕(指针追逐、缓存未命中诱导)数据结构。 std::vector 几乎总能胜过它(无论您的教科书如何评价理论性能)。

    【讨论】:

    • 另外,如果必须找到插入点,O(1) 插入很快就会变成 O(N)。
    • 这似乎是一些练习,实现了自己的链表,所以你的答案可能没有你想象的那么有用。
    • @DenisSablukov 如果是这样,那么 OP 应该在问题中明确说明。
    • @user4581301 如果您必须找到插入点,则插入链表也是线性的。只有当你有一个指向该位置的指针(迭代器、引用)时,它才是常量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2014-08-06
    相关资源
    最近更新 更多