我知道指针是如何工作的。
我用这种方式做了类似的问题
deleteNode(struct node *head_ref, int key);
正在运行,而@ http://quiz.geeksforgeeks.org/linked-list-set-3-deleting-node/他们已经使用了
deleteNode(struct node **head_ref, int key);
哪个也正确但是有理由这样做,第一个会在任何情况下失败或者是不好的方式等。
struct linked_list *deleteNode(struct linked_list *head, int key )
{
struct linked_list *prevNode,*current,*temp;
if( head==NULL)
return head;
if(head->data==key)
{
if(head->next==NULL)
{ free(head);
return NULL;
}
else
temp=head->next;
free(head);
return temp;
}
prevNode= head;
current=head->next;
printf("\n %d\n",(current->data));
while((current!=NULL) && (current->data!=key))
{ printf("\n here");
prevNode= current;
current=current->next;
}
if(current==NULL){
printf("\n element not present in list !\n");
return head;
}
if(current->next==NULL)
prevNode->next=NULL;
else
prevNode->next=current->next;
free(current);
return head;
}
head=deleteNode(head,key);
答案 0 :(得分:1)
如果您需要删除头节点,第一个功能将无法正常工作,因为您无法更改头节点。第二个函数获取头节点的地址,以便在需要时可以更改。
链接中的deleteNode
功能包含以下内容:
struct node* temp = *head_ref, *prev;
// If head node itself holds the key to be deleted
if (temp != NULL && temp->data == key)
{
*head_ref = temp->next; // Changed head
free(temp); // free old head
return;
}
您可以在此处看到它解除引用head_ref
以更改其指向的内容。
答案 1 :(得分:1)
让我们忘记链表,只考虑更新变量。有两种同样有效的方法:
// 1. pass back
int update_int1(int val) {
return val + 1;
}
void caller1() {
int var = 1;
var = update_int1(var);
}
// 2. write back
void update_int2(int *val) {
*val += 1;
}
void caller2() {
int var = 1;
update_int2(&var);
}
这很容易理解,所以让我们用指针做同样的事情:
// 1. pass back
char *update_ptr1(char *ptr) {
return ptr + 1;
}
void caller1() {
char *ptr = malloc(10);
ptr = update_ptr1(ptr);
}
// 2. write back
void update_ptr2(char **ptr) {
*ptr += 1;
}
void caller2() {
char *ptr = malloc(10);
update_ptr2(&ptr);
}
它与int
完全相同!关键是,如果你想回写而不是传回,总会有一个星。
您选择的模式取决于您。回写方法在链表中非常流行。
答案 2 :(得分:0)