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 使用按值传递,因此您无法更改调用者用作列表头的内容。但是您可以更改该结构实例中字段的值。”
我们可以使用 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;
}