链表,在尾部后面插入节点

Linked List, insert node after tail

本文关键字:插入 节点 尾部 链表      更新时间:2023-10-16

我的函数应该在给定位置之后插入一个新节点,或者,如果位置是尾部,则将其插入尾部之后并制作新的节点尾部。

它适用于在给定位置插入节点,但在尾部之后插入时不起作用。当我运行用于在尾巴后插入的代码时,出现分段错误。任何帮助将不胜感激!

ListNode *insertAfter(ListNode *argNode, int value) {
        ListNode *newNode = new ListNode(value);
        if(argNode != tail){
          argNode->next = newNode;
        } else {
          tail->next = newNode;
          tail = newNode;
        }
        size++;
        return newNode;
 }

让链表如下。

Node1 -> Node2 -> NULL
Tail=Node2

如果将节点 3 插入末尾。

Tail->Next = Node3
Node3->Next = NULL
So, the result is
Node1->Node2->Node3-> NULL

还行。但是,如果您将节点 3 插入到节点 1 之后的位置。

ArgNode(Node1)
prev: Node1->Node2->NULL
next: Node1->Node3->NULL. Node2->NULL.

问题是 Node3 的下一个位置丢失了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct ListNode {
    int value ;
    ListNode *next ;
    ListNode(int v) { value=v; next=NULL; }
};
int size=0 ;
ListNode *head = NULL;
ListNode *tail=NULL ;
ListNode *insertAfter(ListNode *argNode, int value) {
    ListNode *newNode = new ListNode(value);
    if ( argNode==NULL ) {
        if ( head==NULL ) {
            // initialize first node.
            head = tail = newNode ;
            newNode->next=NULL ;
        } else {
            // insert first node 
            newNode->next = head ;
            head = newNode ;
        }
    }
    else if(argNode != tail){
        newNode->next = argNode->next;
        argNode->next = newNode;
    } else {
        tail->next = newNode;
        tail = newNode;
    }
    size++;
    return newNode;
}
void printList(ListNode *a) {
    while ( a!=NULL ) {
        printf("%d ", a->value) ;
        a=a->next ;
    }
    printf(" size=%dn", size) ;
}

int main() {
    ListNode *n, *n3, *n2 ;
    head =insertAfter(NULL, 10) ;
    printList(head) ;
    n2 = insertAfter(tail, 20) ;
    printList(head) ;
    n3 = insertAfter(tail, 30) ;
    printList(head) ;
    n = insertAfter(tail, 40) ;
    printList(head) ;
    n = insertAfter(n3, 35) ;
    printList(head) ;
    n = insertAfter(n2, 25) ;
    printList(head) ;
    n = insertAfter(NULL, 5) ;
    printList(head) ;
    return 0 ;
}

输出是这样的。

10  size=1
10 20  size=2
10 20 30  size=3
10 20 30 40  size=4
10 20 30 35 40  size=5
10 20 25 30 35 40  size=6
5 10 20 25 30 35 40  size=7

argNode->next = newNode;之前插入newNode->next = argNode->next; .如果不是,你就会破坏链表中的链,因为你忘记将argeNode->next值附加到链上。