我有一个单独的链表。如果我想从此链表中删除已知元素,我该怎么办?
例如: 节点*头; (44) 节点*尾; (39)
链表:44 27 59 13 45 39 我们想从中删除45。并得到:44 27 59 13 39
我只想到从列表中删除第一个元素(如果元素(需要删除)是列表的第一个元素)。 我得到了:head = head->下;
如何从列表中删除中间节点?
答案 0 :(得分:1)
13将指向45作为其下一个元素,将其下一个元素简单地更改为39.并将45从内存中释放出来,只是为了防止内存从垃圾中清除。
答案 1 :(得分:1)
此伪代码可能对您有所帮助: -
void remove(int key) {
Node* p = head->next;
Node*prev = head;
while(p!=NULL) {
if(p->data==key) {
prev->next = p->next;
free(p);
break;
}
prev = p;
p = p->next;
}
}
答案 2 :(得分:0)
如果有值,请查看下一个节点中的值。如果这是您要查找的值,则下一个节点是要删除的节点,因此在保留指向下一个节点的指针后,您可以使当前节点的下一个元素指向下一个节点的下一个元素,以便您可以删除它
// Assuming head is a non-const reference variable (or a global variable)
if (head == NULL)
return;
if (head->value == wanted)
{
head = head->next;
return;
}
for (Node *curr = head; curr->next != NULL; curr = curr->next)
{
if (curr->next->value == wanted)
{
Node *old = curr->next;
curr->next = curr->next->next;
delete old;
return;
}
}
return; // Possibly after reporting that the value wanted was not found
答案 3 :(得分:0)
首先,找到要删除的元素。不要忘记在元素不存在时进行处理:
Node* find(Node* head, int value) {
do {
if (head->value == value) return head;
head = head->next;
} while (head);
return nullptr;
}
然后,您希望将上一个节点的next
ptr连接到下一个节点。在单链接列表中,您可以使用局部变量跟踪上一个节点。如果您要删除的节点是头部(即没有上一个节点),或者节点是尾部(即没有下一个节点),请不要忘记处理:
Node *previous = nullptr;
do {
if (head->value == value) {
if (previous != nullptr) {
previous->next = head->next;
}
if (head == tail) {
tail = previous;
}
return;
}
previous = head;
head = head->next;
} while (head);
答案 4 :(得分:0)
仔细思考问题。
您需要一个循环来遍历所有节点,直到找到您要查找的节点。假设你有Node * curr,prev都指向head。
while(curr != null)
对于每个节点,您需要检查值是否与您要查找的节点匹配。
if (curr->value == node_you_are_looking_for->value)
如果这是匹配节点,请删除此节点。您有两个指针来更新链接。
prev->next = curr->next;
prev = curr;
curr = curr->next;
prev->next = null;
delete(prev);
继续浏览列表。
prev = curr;
curr= curr->next;
然后你可以组装所有这些步骤并编写一个工作程序。
答案 5 :(得分:0)
您只需要首先分析问题,然后知道我们删除特定节点后需要进行的更改。 让我们假设我们有应该删除的节点的地址 如果节点是第一个节点,最后一个节点或中间节点(即最少2个节点),则可能有3种情况。
void deletenode(struct node **s,struct node *t){
struct node *temp;
if(*s==t)
{
*s=t->next;
free(t);
}
else{
temp=*s;
while(temp->next!=t)
{
temp=temp->next;
}
temp->next=t->next;
delete(t);
}
}