在 C 中修改链表头节点而不进行指针取消引用[重复]

问题描述 投票:0回答:1
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    // Function body
}

当我尝试将新节点链接到链表的头部时,问题就出现了。虽然我正在更新函数内的 obj 指针以指向新的头节点,但似乎更改并未反映在实际的链表中。

我需要指导如何在LeetCode提供的函数结构的约束下正确更新链表的头节点,而不诉诸指针解引用。

任何见解或替代方法将不胜感激!预先感谢您的帮助。

这是我的代码,在使用这种特定口味的情况下,请仅关注 myLinkedListAddAtHead 函数。

我在函数中包含了一些 printf 语句来跟踪行为。然而,即使新节点在函数内部被链接为头节点,这种变化似乎并没有反映在实际的链表中。

["MyLinkedList","addAtHead","addAtHead","addAtHead","addAtHead","get"]


[[],[1],[5],[8],[3],[0]]



typedef struct list {
    int val;
    struct list* next;
} MyLinkedList;


MyLinkedList* myLinkedListCreate() {
    MyLinkedList* newNode = (MyLinkedList*) malloc(sizeof(MyLinkedList));
    newNode -> next = NULL;
    newNode -> val = NULL;
    return newNode;
}

int myLinkedListGet(MyLinkedList* obj, int index) {
    if(obj == NULL) return -1;
    if(index == 0) {
        return obj -> val;
    }
    MyLinkedList* temp =  obj;
    int i = 0;
    while(temp != NULL) {  
        if( i + 1 == index ) {
            return temp -> val;
        }
        i++;
        temp = temp -> next;
    }
    return -1;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    if(obj == NULL) return;
    if(obj -> val == NULL) {
        obj -> val = val;
        printf("Assigning value to the first node\n");
        return;
    }
    printf("| current Head : %d | ", obj  -> val);
    MyLinkedList* temp = obj;
    MyLinkedList* newNode =  myLinkedListCreate();
    newNode -> val = val;
    newNode -> next = obj;
    obj = newNode; // This doesn't update the head of the real linked list
    MyLinkedList* x = obj;
    printf("new Head : %d | ", obj  -> val);
    printf("new list : ");
    while(x != NULL) {
        printf(" %d ", x -> val);
        x = x -> next;
    }
     printf("\n");
    
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    if(obj == NULL) return;
    MyLinkedList* newNode =  myLinkedListCreate();
    MyLinkedList* temp =  obj;
    newNode -> val = val;
    while(temp -> next != NULL) {
        temp = temp -> next;
    }
    temp -> next = newNode;
    
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    if(obj == NULL) return;
    MyLinkedList* newNode =  myLinkedListCreate();
    MyLinkedList* temp =  obj;
    newNode -> val = val;
    int i = 0;
    while(temp != NULL) {  
        if( i + 1 == index ) {
            break;
        }
        i++;
        temp = temp -> next;
    }
    newNode -> next =  temp -> next;
    temp -> next = newNode;
    
}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    if(obj == NULL) return;
    MyLinkedList* temp =  obj;
    int i = 0;
    while(temp != NULL) {  
        if( i + 1 == index ) {
            break;
        }
        i++;
        temp = temp -> next;
    }
    MyLinkedList* dummy = temp -> next;
    temp -> next = dummy -> next;
    free(dummy);
    
}

void myLinkedListFree(MyLinkedList* obj) {
    if(obj == NULL) return;
    MyLinkedList* temp = obj;
    while(temp != NULL) {  
        MyLinkedList* dummy = temp->next; 
        free(temp);
        temp = dummy; 
    }
}



/**
 * Your MyLinkedList struct will be instantiated and called as such:
 * MyLinkedList* obj = myLinkedListCreate();
 * int param_1 = myLinkedListGet(obj, index);
 
 * myLinkedListAddAtHead(obj, val);
 
 * myLinkedListAddAtTail(obj, val);
 
 * myLinkedListAddAtIndex(obj, index, val);
 
 * myLinkedListDeleteAtIndex(obj, index);
 
 * myLinkedListFree(obj);
*/

[有一些 printf 会向你展示奇怪的行为]

c pointers linked-list
1个回答
0
投票

“C 使用按值传递,因此您无法更改调用者用作列表头的内容。但是您可以更改该结构实例中字段的值。”

我们可以使用 head 作为虚拟节点来指向新的 head。

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    if(obj == NULL) return;
    MyLinkedList* newNode =  myLinkedListCreate();
    newNode -> val = val;
    newNode -> next = obj -> next;
    if(obj -> val == NULL) {
        obj -> val = 999;
        obj -> next = newNode;
        printf("giving first node a value \n");
        return;
    } 
    obj -> next = newNode;
}
© www.soinside.com 2019 - 2024. All rights reserved.