首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C递归地从链表中删除元素

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。在C语言中,可以使用递归的方式从链表中删除元素。

首先,我们需要定义链表节点的结构体:

代码语言:txt
复制
typedef struct Node {
    int data;
    struct Node* next;
} Node;

接下来,我们可以编写一个递归函数来删除链表中的元素。假设要删除的元素为target,函数的参数包括链表的头节点head和目标元素target

代码语言:txt
复制
Node* deleteNode(Node* head, int target) {
    // 如果链表为空,直接返回
    if (head == NULL) {
        return head;
    }
    
    // 如果头节点是目标元素,删除头节点并返回新的头节点
    if (head->data == target) {
        Node* newHead = head->next;
        free(head);
        return newHead;
    }
    
    // 递归删除下一个节点
    head->next = deleteNode(head->next, target);
    
    return head;
}

这个递归函数的思路是,如果链表为空,则直接返回;如果头节点是目标元素,则删除头节点并返回新的头节点;否则,递归删除下一个节点,并将当前节点的指针指向删除后的链表。

下面是一个示例的链表删除元素的完整代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

Node* deleteNode(Node* head, int target) {
    if (head == NULL) {
        return head;
    }
    
    if (head->data == target) {
        Node* newHead = head->next;
        free(head);
        return newHead;
    }
    
    head->next = deleteNode(head->next, target);
    
    return head;
}

void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    // 创建链表
    Node* head = (Node*)malloc(sizeof(Node));
    head->data = 1;
    
    Node* node1 = (Node*)malloc(sizeof(Node));
    node1->data = 2;
    head->next = node1;
    
    Node* node2 = (Node*)malloc(sizeof(Node));
    node2->data = 3;
    node1->next = node2;
    
    node2->next = NULL;
    
    // 删除元素
    int target = 2;
    head = deleteNode(head, target);
    
    // 打印链表
    printList(head);
    
    // 释放内存
    free(node2);
    free(node1);
    free(head);
    
    return 0;
}

这段代码创建了一个包含3个节点的链表,然后删除了值为2的节点,并打印了删除后的链表。

在腾讯云的产品中,与链表相关的产品可能是存储类产品,例如对象存储 COS(https://cloud.tencent.com/product/cos)可以用来存储链表节点的数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 删除排序链表的重复元素删除排序链表的重复元素 II

    Remove Duplicates from Sorted List 题目大意 删除一个有序链表重复的元素,使得每个元素只出现一次。...,删除后不再有原先重复的那些数字。...解题思路 不同的地方是这里要删掉所有的重复项,由于链表开头可能会有重复项,被删掉的话头指针会改变,而最终却还需要返回链表的头指针。...所以需要定义一个新的节点,然后链上原链表,然后定义一个前驱指针和一个现指针,每当前驱指针指向新建的节点,现指针从下一个位置开始往下遍历,遇到相同的则继续往下,直到遇到不同项时,把前驱指针的next指向下面那个不同的元素...如果现指针遍历的第一个元素就不相同,则把前驱指针向下移一位。

    2.8K20

    删除链表元素基本操作。链表

    删除链表中等于给定值val的所有节点。 样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。 基本操作。...遍历的时候当前数据比较的话会丢失掉前一个节点的信息,所以我们current->next->val作为遍历的主体,这样我们在头节点之前加一个假的节点。...链表 链表有很多种,这里给的是单向链表链表由节点构成,每一个节点包含两个信息,分别是数据和链(实际上就是一个指针,指向下一个节点,如果没有下一个这个指针为NULL)。...除此之外还有双向链表(每一个链表有两条链,分别指向前一个和后一个节点),循环链表也是有的,就是收尾又链接起来,显而易见是有单向循环也有双向循环的。...链表的优点: 插入删除方便,只要改变指针的指向就可以,不用像数组一样需要移动数据。 链表的缺点: 因为内存不连续,所以查找效率不高。 它的优缺点和数组刚好是反过来的。

    90910

    删除有序链表的重复元素

    C(head.next.next),这样如果B的值与A相同,则就是要去掉的,即head.next=head.next.next ,第二节点的位置由第三个的值覆盖。...思路三:如果这个有序的链表变为了无序的呢,那么明显不能只用一个变量来进行存储,这时候我们可以set集合来进行处理,这样不管是有序还是无序其实问题都不大,但是对于这种我们又该如何减少开销,再次提高性能。...ListNode deleteDuplicates2(ListNode head) {         if (head == null || head.next == null) //排除传输一个null的链表或者只有一个元素链表...            return head;         Set set = new HashSet();        //使用set集合,这样用于判断元素是否已经存在于集合,且不会存储重复的值...ListNode deleteDuplicates1(ListNode head) {         if (head == null || head.next == null) //排除传输一个null的链表或者只有一个元素链表

    1.1K30

    Java如何优雅删除List元素

    在工作的许多场景下,我们都会使用到List这个数据结构,那么同样的有很多场景下需要删除List的某一个元素或某几个元素,那么我们该如何正确无误删除List元素的,今天我来教大家三种方式。...为了解决以上问题, Iterator 模式腾空出世,它总是同一种逻辑来遍历集合。使得需要遍历集合的人,在遍历的时候不需要了解集合的内部结构,所有的内部状态都由 Iterator 来维护。.../** * 通过简单的遍历方式,在遍历的过程中有可能会漏掉元素 * 取第二个元素i=1时,满足条件被删掉,原有的数组的第三个元素,变成了新数组的第二个元素 * i++后i=2,但i=2指向的是新数组的第三个元素...* 同理倒数第二个元素满足条件被删除时,i--后,原数组的倒数第三个变成了新数组的倒数第二个元素 * i= size-3指向新数组的倒数第二个元素,也没有漏掉 * * @param list *...break 使用增强for循环,删除元素后,立即跳出,则正常退出,但缺点是不能向后继续循环了。

    2.8K10

    【拿捏链表(Ⅱ)】—Leetcode删除排序链表的重复元素

    目录 删除排序链表的重复元素(Ⅰ) 删除排序链表的重复元素(Ⅱ) 删除排序链表的重复元素(Ⅰ) 题目: 给定一个已排序的链表的头 head ,删除所有重复的元素,使每个元素只出现一次 。...cur; } cur=cur->next; } //最后置空,防止野指针 tail->next=NULL;; return head; } 删除排序链表的重复元素...(Ⅱ) 题目: 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。...返回 已排序的链表 思路:该题是上题的升级版本,稍稍复杂了一点点,不过核心思想是一样的,为非就是遍历,然后比较。这里我们哨兵卫的单链表,方便我们对节点进行比较。...cur指针哨兵卫开始,对后面的两个节点进行比较,如果不相等,就进行尾插,如果相等的话,将这个值tmp保存下来,然后让cur的next往后走,直到找到与该值不相等的,再进行与后面的节点比较是否相等,循环往后走

    49720

    删除排序链表重复元素的方法

    链表的操作非常常见,也是面试中经常会被问道的问题。对于链表重复元素删除,有两个变体,现在总结如下。...* @description 给定一个排序链表删除所有重复的元素,使得每个元素只出现一次。...2.删除全部重复的元素,只保留没有重复的元素。 *@description * 给定一个排序链表删除所有含有重复数字的节点,只保留原始链表 没有重复出现 的数字。...你需要考虑两个问题: 如果链表头就是重复的数字怎么办 如何移动比较链表删除元素? 第一,对于表头重复的问题,那么最简单的办法就是在表头添加一个元素,加入链表。...第二,对于如何移动比较的问题,此时发现,一个指针无论如何也无法实现题目的需求了。此时看到了参考文档的三指针法。

    1K10
    领券