单链表的操作——查找链表C(带头结点)中是否存在一个值为x的结点,若存在,则删除该结点并返回1,否则返回0

一、【问题描述】

查找链表C(带头结点)中是否存在一个值为x的结点,若存在,则删除该结点并返回1,否则返回0

二、【问题分析】

对于本题需要解决两个问题:一个是要找到值为x的结点,另一个是将找到的结点删除。即链表中结点的查找。为了实现查找,定义一个结点指针变量p,让它沿着链表一直走到表尾, 每遇到一个新结点就检测其值是否为x,是则证明找到,不是则继续检测下一个结点,当找到值为x的结点后就删除该结点。

三、【问题解答】

Talk is cheap,show you the code:

int findAndDelete(LNode *C,int x){
	LNode *p,*q;
	p=C;
	while(p->next!=NULL){
		if(p->next->data=x){
			break;
		}
		p=p->next;
	}
	if(p->next==NULL){
		return 0;
	}
	else{
		q=p->next;
		p->next=p-next-next;
		free(q);
		return 1; 
	}
}
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 初始化指针p指向单链表头结点。 2. 当p不为NULL时,比较p所指向的结点数据域与x的值。 a. 若相等,则输出“存在该元素”标志,结束查找。 b. 若不相等,则将p指向下一个结点。 3. 若p为NULL,则输出“不存在该元素”标志,结束查找算法实现: ``` void searchNode(LinkList L, int x) { ListNode *p = L->next; while (p != NULL) { if (p->data == x) { printf("存在该元素\n"); return; } p = p->next; } printf("不存在该元素\n"); } ``` ### 回答2: 要在头结点的非空单链表L查找值为x的结点,可以使用以下算法实现。 1. 将链表L的头指针赋值给一个临时指针变量p,即p指向链表的第一个结点。 2. 对p进行循环,直到p指向空,每次循环都执行下面的操作。 1) 如果p结点的数据域的值等于x,说明找到了值为x的结点,输出“存在该元素”标志,结束算法。 2) 否则,将p的下一个结点的地址赋值给p,即p指向下一个结点。 3. 如果循环结束时仍然没有找到值为x的结点,说明不存在该元素,输出“不存在该元素”标志。 该算法的时间复杂度为O(n),其n为链表L的长度。下面是算法的Python代码实现: ```python def find_node(L, x): p = L.next # 头结点的下一个结点 while p != None: if p.data == x: print("存在该元素") return p = p.next print("不存在该元素") ``` 使用该算法可以在头结点的非空单链表L查找值为x的结点成功找到该结点时输出“存在该元素”标志,否则输出“不存在该元素”标志。 ### 回答3: 以下是一种算法实现,在头结点的非空单链表L查找值为x的结点: 1. 初始化一个指针p,指向L的头节点的下一个节点(即第一个实际节点)。 2. 循环遍历链表,直到p指向链表的尾节点或者找到值为x的结点: - 如果当前节点p的值等于x,则输出“存在该元素”标志,并结束循环。 - 否则,将p指向下一个节点,继续循环。 3. 如果循环结束后p指向链表的尾节点,说明没有找到值为x的结点,则输出“不存在该元素”标志。 具体实现代码如下: ```python def search_node(L, x): p = L.next # 初始化指针p while p is not None and p.value != x: p = p.next # 移动指针p if p is not None: # 找到值为x的节点 print("存在该元素") else: print("不存在该元素") # 测试 L = LinkedList() # 初始化头结点的非空单链表L # 往L添加节点... search_node(L, x) ``` 该算法的时间复杂度为O(n),其n为链表长度。由于需要遍历整个链表查找目标节点,所以算法的时间复杂度与链表长度成正比。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值