已知线性表中的元素以值递增有序,并以单链表作存储结构。试写一高效的算法,删除有序表中所有其值大于 mink 且小于maxk的数据元素。
时间: 2023-05-03 19:00:53 浏览: 117
题目要求删除程序表中所有元素值大于mink且小于maxk的数据元素。可能的算法有很多种,以下是其中一种高效的算法:
将链表头指针p指向程序表的第一个节点,用q指向p的后继节点。用r指向p,然后开始遍历整个链表:
1. 如果q节点的元素值大于等于mink且小于等于maxk,则将r的后继指针指向q的后继节点,同时删除q节点。
2. 如果q节点的元素值小于mink,则p指向q,q指向q的后继节点,r不变。
3. 如果q节点的元素值大于maxk,则r指向q,q指向q的后继节点,p不变。
4. 重复以上操作,直到q指向链表尾节点。
最后返回链表头指针p。
这个算法的时间复杂度是O(n),其中n是程序表中的元素个数。
相关问题
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间
可以使用双指针来实现该算法。
1. 先找到第一个大于等于x的节点p,并记录其前驱节点pre。
2. 从p开始遍历链表,将符合条件的节点进行删除。直到遍历到第一个大于等于y的节点或链表结束。
3. 在删除符合条件的节点的同时,需要释放其占用的空间,并及时维护指针关系。
4. 最后返回链表的头节点,完成算法实现。
下面是算法实现的(C语言)代码:
typedef struct Node{
int val; // 元素值
struct Node* next; // 指向下一个节点的指针
} ListNode;
ListNode* deleteInRange(ListNode* head, int x, int y){
// 找到第一个大于等于x的节点并记录其前驱节点pre
ListNode* pre = NULL;
ListNode* p = head;
while(p && p->val < x){
pre = p;
p = p->next;
}
// 遍历链表删除符合条件的节点
while(p && p->val < y){
ListNode* q = p;
p = p->next;
// 释放空间
free(q);
}
// 维护指针关系
if(pre){
pre->next = p;
return head;
}else{
return p;
}
}
// 调用示例
ListNode* head = NULL;
head = deleteInRange(head, 3, 7);
已知线性表的元素以递增有序排列,并且单链表存储。试写一高效的算法,删除表中所有值相同的元素。(只留下不同元素)
可以使用双指针法,一个指针p指向当前不重复的元素,另一个指针q用于遍历整个链表。当p和q指向的元素值相同时,q继续向后遍历;当p和q指向的元素值不同时,将p的下一个节点指向q,然后p指向下一个节点,继续遍历。最后,将p的下一个节点置为NULL,即可删除所有重复元素。
具体实现如下:
void deleteDuplicates(ListNode* head) {
if (head == NULL) return;
ListNode* p = head;
ListNode* q = head->next;
while (q != NULL) {
if (p->val == q->val) {
q = q->next;
} else {
p->next = q;
p = p->next;
q = q->next;
}
}
p->next = NULL;
}
阅读全文