📜  C测验– 109 |问题5(1)

📅  最后修改于: 2023-12-03 14:40:26.287000             🧑  作者: Mango

C测验-109 | 问题5

本题涉及C语言的链表操作,需要熟悉链表的创建、插入、删除等操作。

题目描述

给定一个链表的头结点head,删除链表中所有值为val的节点。

解题思路

遍历链表,如果当前节点的值等于目标值,则删除当前节点。在删除节点之前,需要将当前节点的前一个节点和后一个节点相连。

删除一个节点时,可以通过设置一个指针pre,使其指向当前节点的前一个节点,然后将pre与当前节点的后一个节点相连,即完成了节点的删除操作。

需要注意的是,如果头结点的值等于目标值,则要特殊处理,即将头结点后移。

参考代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* pre = NULL;
    struct ListNode* cur = head;

    while (cur) {
        if (cur->val == val) {
            if (pre == NULL) {
                head = head->next;
                cur = head;
            } else {
                pre->next = cur->next;
                cur = cur->next;
            }
        } else {
            pre = cur;
            cur = cur->next;
        }
    }

    return head;
}
总结

链表的操作需要考虑节点的添加、删除、更新等问题,需要注意空节点和头结点的特殊处理。在解决链表问题时,建议使用双指针、虚拟头结点等技巧。