【算法题】4.删除链表指定范围内的结点

136 阅读1分钟

题目

设计一个算法,删除递增有序链表中值大于等于 mink 且小于等于 maxk 的。minkmaxkmaxk是给定的两个参数,其值可以和表中的元素相同,也可以不同的所有元素。

题目大意

删除链表中属于范围 mink<=n<=maxkmink<=n<=maxk 的值。

输入

0->2->4->6->8->10

输出

10->8->6->4->2->0

解析

迭代法。

  1. 维护一个p指针指向L的首元结点,维护一个q指针指向L的头结点用于记录上一次迭代的无需删除的结点。
  2. mink<=p<=maxkmink<=p<=maxk,则使得一个Temp指针指向p,将当前q的下一个结点指向要删除的p结点的下一个结点,p指向p的下一个结点,释放Temp指向的结点。
  3. p<minkp<minkp>maxkp>maxk,记录q指向当前p结点,p指向p的下一个结点,直至迭代完成。

复杂度分析

时间复杂度:O(n)O(n) 空间复杂度:O(1)O(1)

代码

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;
         }
      }

}