题目
设计一个算法,删除递增有序链表中值大于等于 mink 且小于等于 maxk 的。mink、是给定的两个参数,其值可以和表中的元素相同,也可以不同的所有元素。
题目大意
删除链表中属于范围 的值。
输入
0->2->4->6->8->10
输出
10->8->6->4->2->0
解析
迭代法。
- 维护一个
p指针指向L的首元结点,维护一个q指针指向L的头结点用于记录上一次迭代的无需删除的结点。 - 若,则使得一个
Temp指针指向p,将当前q的下一个结点指向要删除的p结点的下一个结点,p指向p的下一个结点,释放Temp指向的结点。 - 若或,记录q指向当前p结点,
p指向p的下一个结点,直至迭代完成。
复杂度分析
时间复杂度: 空间复杂度:
代码
void deleteRangWithLists(LinkList *l1,int mink,int maxk){
if (l1 == NULL)
{
return;
}
ListNode *p1 = (*l1)->next;
ListNode *q = (*l1);
while(p1!= NULL){
int pVal = p1->data;
if (pVal >= mink && pVal <= maxk)
{
ListNode *temp = p1;//6
q->next = p1->next;// 3->next = 9;
p1 = p1->next; //9
free(temp);//释放6
}else{
//3 // 9
q = p1;
p1 = p1->next;
}
}
}