在链表代码的尾部插入节点

时间:2018-04-28 16:29:59

标签: c linked-list

我正在尝试解决hackerrank上的数据结构问题。我似乎无法找到我的代码有什么问题。我想知道这里有什么问题。

Node* Insert(Node *head,int data){
struct Node *ptr = head,*new_node=(struct Node*)malloc(sizeof(struct Node));

new_node->data=data;
new_node->next=NULL;
if(ptr){
    while(ptr->next != NULL){
        ptr=ptr->next;
    }
    ptr->next=new_node;
}
else{
    head=new_node;
}
return(head);
}
奇怪的是,在我练习的几个月前,同样的代码被接受了。这是link to the problem

P.S。我花了好几个小时试图搞清楚,而且我不确定SO是否适合提问。如果不是,我愿意将其删除。

编辑:

Node is defined as 

  struct Node
  {
     int data;
     struct Node *next;
  }

2 个答案:

答案 0 :(得分:0)

首先typedef避免命名不匹配的结构。

struct node {
     int data;
     struct node *next;
};
typedef struct node Node;

Insert()功能应该是

void Insert(Node **head,int data){
        while(*head){
                head = &(*head)->next;
        }
        *head = malloc(sizeof **head);
        (*head)->data=data;
        (*head)->next=NULL;
}

并像这样致电Insert()

int main() {
        Node *headptr = 0;
        Insert(&headptr, 100);/*pass the address of headptr */
        /*.. 
        display(headptr); 
        */
        return 0;
}

答案 1 :(得分:-1)

我认为你的代码是不正确的,因为误解了指针如何通过值传递,在你的情况下,如果列表为空,你将会这样做:

head=new_node;

但是这会将新节点分配给头部而不是一些临时头指针副本(头部),你的真实头部仍为空,所以你必须将指针传递给指向头部的指针:

Node* Insert(Node **head,int data)

并指定:

*head = new_node;