C语言单链表递归删除,c语言设计一个递归算法,删除不带头结点的单链表L中所有值为x的节点...

博主通过重新学习递归概念,解决了之前对C语言链表递归操作的误解。本文分享了如何使用递归方法解决LeetCode第203题,即在不带头节点的链表中删除所有值为x的节点,尽管递归效率较低。附带测试代码和截图。
摘要由CSDN通过智能技术生成

之前我有写过这个的答案,但是当时真的是太navie,无知者无畏啊,我竟然因为此来怀疑c语言对链表不能实行递归,归结原因是我对递归了解的不够透彻,今天重新学习了一下递归,也就重新编写了一下代码。

同时这也是leetcode上面203题的答案(当然用递归的话,时间复杂度会高,所以时间会长一点,如果用迭代的话会好很多)

b6c25c30096d0000c18ace8c2a1ecee4.png

主要思路是这张图(图来源于这个课程)

124979988bd1da66ab488769783decb4.png

delete_x.h

#ifndef _DELETE_H_

#define _DELETE_H_

#include#include#include//递归删除不带头节点的单链表L中所有值为x的结点

typedef struct Node

{

int val;

struct Node* next;

}ListNode;

//创建一个不带头节点的链表 返回链表的头指针

ListNode* Init_List()

{

ListNode* head = (ListNode*)malloc(sizeof(ListNode));

assert(head);

int first,size;

printf("please enter list sizes: ");

scanf("%d",&size);

printf("please enter list elements: ");

scanf("%d",&first);

head->val = first;

head->next = NULL;

//采用尾插法,构建链表

//则需要构建一个链表的尾指针

ListNode* tail = head;

for(int i = 1; i < size ; i++)

{

ListNode* new = (ListNode*)malloc(sizeof(ListNode));

assert(new);

scanf("%d",&first);

new -> val = first;

tail-> next = new;

new -> next = NULL;

tail = tail->next;

}

return head;

}

void print_list(ListNode* head)

{

ListNode* p;

p = head;

while(p != NULL)

{

printf("%d ", p->val);

p = p->next;

}

printf("\n");

}

ListNode* removeElements(ListNode* head, int val){

if(head == NULL)

return NULL;

ListNode* last = removeElements(head->next,val);

if(head->val == val)

return last;

else

{

head->next = last;

return head;

}

}

#endif

delete_x.c

#include"delete_x.h"

int main(int argc, char const *argv[])

{

int number ;

ListNode* head = Init_List();

printf("please enter the number you want to delete: ");

scanf("%d",&number);

head = removeElements(head,number);

print_list(head);

return 0;

}

测试截图:

d9d8ec2817b74c0aac452004741f9e99.jpg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值