【问题标题】:how to insert a linked list after a particular node inside head? c++如何在头部的特定节点之后插入链表? C++
【发布时间】:2015-12-07 00:51:13
【问题描述】:

我编写了以下代码来将整数插入到链表中,但采用排序方法。

我评论了我的问题所在并在下面进行了解释:

void LLL::insertSorted(int r) {
    node * temp = NULL;
    node * current = NULL;

    if (head == NULL) {
        head = new node;
        head->data = r;
        head->next = NULL;
    } else {
        temp = new node;
        temp->data = r;
        current = head;
        while (temp->data > current->data && current != NULL) {
            current = current->next;
        }
        temp->next = current;
        /* 
         * Assume that I have head points to this list: { 3 -> 5 -> 8 -> NULL }
         * And I want to insert {6} (temp) to the list just after 5; then what 
         * I've done so far on my previous code I made temp = {6 -> 8 -> NULL}.
         * NOW!! How can correctly insert temp to ((head)) just after {5}??!
         */
    }
}

【问题讨论】:

  • 你在旅行时需要一个以前的tem 链接,添加previous = current;当前=当前->下一个之前;在 temp->next = current 之后;添加上一个->下一个 = temp;
  • @JerryChen 我已将您的建议添加到我的 sn-ps 中。你是这个意思吗?如果是,它将如何改变我的想法?
  • 1.空列表 2. 最小的数
  • @JerryChen 你会解释更多吗?我是这个概念的新手,我比文字更了解代码

标签: c++ linked-list nodes head


【解决方案1】:
void LLL::insertSorted(int r) {
    node * cur = head;
    node * prev = NULL;

    while((cur != NULL) && (r > cur->data)){//find the location to insert
        prev = cur;
        cur = cur->next;
    }

    node *new_node = new node;
    new_node->data = r;
    new_node->next = cur;

    if(prev == NULL){//new first one
        head = new_node;
    }else{
        prev->next = new_node;
    }
}

【讨论】:

  • 这将如何改变我的想法?你能解释一下吗?
  • 所以你只需要在列表为空的时候换头,或者当你想插入的数字最小的时候。如果列表为空,则“new_node”为 (num, empty),我们将这个 new_node 分配给 head。否则(当列表不为空,并且您尝试插入的数字是最小的),代码中的“while循环”部分将不会执行,因为num(r)data),所以new_node现在是( num, cur(previous head)),我们将这个 new_node 分配给 head
  • @Soce1991 上述评论是否有助于您更好地理解?
  • 是的,但我想我已经对上面的代码做了这个,你不同意吗?
  • @Soce1991 您在答案部分编写的代码对我来说似乎不错,但它并不干净。尽量避免重复代码。
【解决方案2】:

您需要记住要插入的节点,并将该节点链接到新节点。

例如,在您的循环中查找temp、current 之后的节点,有另一个变量,例如prev,然后在current = current->next 之前执行pre = current。

【讨论】:

  • 你能告诉我如何准确地使用我的代码 sn-ps 吗?
  • 你的意思是让前一个节点取消对 {5} 的引用,并使 previous->next = temp?
【解决方案3】:

插入时需要一个新节点
我认为只需在您要插入的前一个节点之后创建一个新节点,例如评论中的 5

【讨论】:

  • 您能否将其应用到我的代码中,以便我更好地理解您的意思,并将其标记为答案,以便其他人找到解决方案?
  • 如果您不想将链接列表更改为双链接列表,可以尝试将您的 while(temp->data > current->data && current != NULL) 更改为 while(temp->data > current->next->data && current != NULL) ,这将使“6”与 8 进行比较,不是5,它会在5之后插入,而不是在8之前,你不需要添加“上一个”节点,只需“下一个”,对不起我的英语不好
  • 你的英文很好,但我更懂代码。所以,如果你能用我的代码来解决这个问题,我们就不需要英语了
  • 谢谢,我认为您可以尝试这种方式,而无需更改您编写的其他代码,只需此 while 语句,因为您编写的是“插入之前”而不是“插入之后”:)
【解决方案4】:

这是最终结果:(有效!) 它处理以下情况:

  • 案例 1:头部为空。
  • 案例2:新元素是列表中最小的。
  • 案例 3:新元素位于列表的中间位置。
  • 案例4:新元素最大。

void LLL::insertSorted(int r) {
    node * temp = NULL;
    node * current = NULL;
    node * previous = NULL;

    if (head == NULL) {
        head = new node;
        head->data = r;
        head->next = NULL;
    } else {
        temp = new node;
        temp->data = r;
        temp->next = NULL;

        current = head;
        if (temp->data < current->data) {
            temp->next = head;
            head = temp;
        } else {
            while (current != NULL && temp->data >= current->data) {
                previous = current;
                current = current->next;
            }
            temp->next = current;
            previous->next = temp;
        }
    }
}

【讨论】:

  • 下面的插入功能好像还可以。检查Node和List的构造函数。
  • @JerryChen 如果我将循环条件的第二部分更改为 (current->next != NULL),它会起作用,但如果我输入 {1 ,2 ,3 ,4 则会跳过第一个输入,5} 我得到 {2, 3, 4, 5, 1}!你知道是什么问题吗?以及如何解决它。 (请用代码回答,小英文)
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多