题目
设计一个算法,删除递增有序链表中值大于等于mink且小于等于maxk(mink,maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同)的所有元素。
题目大意:
删除链表中属于范围mink<=n<=maxk的值。
输入:
0->2->4->6->8->10
输出:
10->8->6->4->2->0
解析:
迭代法。
- 维护一个
p
指针指向L
的首元结点,维护一个q
指针指向L
的头结点用于记录上一次迭代的无需删除的结点。 - 若
mink<=p<=maxk
,则使得一个Temp
指针指向p
,将当前q的下一个结点指向要删除的p
结点的下一个结点,p
指向p
的下一个结点,释放Temp
指向的结点。 - 若
p<mink
或p>maxk
,记录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;
}
}
}
```
网友评论