我有以下的链表实现:如何删除两个索引之间的链表的节点?
struct _node {
char *string;
struct _node *next;
}
struct _list {
struct _node *head;
struct _node *tail;
}
我想作以下功能:
void deleteList(struct _list *list, int from, int to) {
int i;
assert(list != NULL);
// I skipped error checking for out of range parameters for brevity of code
for (i = from; i <= to; i++) {
deleteNode(list->head, i);
}
}
//我跑这个链表这样的功能:[First]->[Second]->NULL
这样deleteNodes(list, 1, 1)
删除第二行,并得到 [First]->[Second]->NULL
但我运行它像这样deleteList(list, 0, 1)
与此输入[First]->[Second]->[Third]->NULL
我有一个seg故障。
这里是我的deleteNode功能
void deleteNode(struct _node *head, int index) {
if (head == NULL) {
return;
}
int i;
struct _node *temp = head;
if (index == 0) {
if (head->next == NULL) {
return;
}
else {
head = head->next;
free(head);
return;
}
}
for (i = 0; temp!=NULL && i<index-1; i++) {
temp = temp->next;
}
if (temp == NULL || temp->next == NULL) {
return;
}
Link next = temp->next->next;
free(temp->next);
temp->next = next;
}
我写了一个单独的函数删除链表的头,如果从或向= 0:
void pop(struct _node *head) {
if (head == NULL) {
return;
}
struct _node *temp = head;
head = head->next;
free(temp);
}
,但它给了我赛格故障或内存错误中止trapL 6.
你的循环,你调用'deleteNode'有一个缺陷:一旦你删除了范围中的第一个节点,下一个要删除的节点就不会像以前那样具有相同的索引。 –
当然!所以我需要保持一个指向新头的指针?还是应该使用完全不同的方法? – user6005857
一个简单的解决方案是反转循环,然后删除范围中的最后一个节点,然后删除最后一个节点,然后是最后一个节点等。 –