单链表OJ

  • 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
ListNode* partition(ListNode* pHead, int x)
{
 ListNode *lesshead = (ListNode *)malloc(sixeof(ListNode));
 ListNode *morehead = (ListNode *)malloc(sizeof(ListNode));
 //设置两个哑结点,作为分割后的链表的头结点,但是它没有有效值。
 ListNode *pless = lesshead;
 ListNode *pmore = morehead;
 ListNode *cur = pHead;
  while (cur)
  {
    if (cur->val < x)
    {
      pless->next = cur;
      pless = pless->next;
    }
    else
    {
      pmore->next = cur;
      pmore = pmore->next;
    }
    cur = cur->next;
  }
 pless->next = moreless->next;//第一个链表的尾部连接到第二个链表的头。
 pmore->next = NULL;
 pHead = lesshead->next;//要最后设置新的头结点,防治发生堆溢出。
 free (lesshead);
 free (morehead);//把前面设置的具有辅助功能的哑结点释放掉。
 return pHead;
 }
  • 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
    例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
ListNode* deleteDuplication(ListNode* pHead)
{
 ListNode *prev = NULL;
 ListNode *cur = pHead;
 ListNode *tail = pHead->next;
   if (pHead==NULL || pHead->next==NULL)
   {return pHead;}
   //当没有结点或许只有一个结点的时候,不会出现有重复的数字,直接返回。
   while (tail)//保证有下一个可以和cur比较的数字
   {
     if(cur->val == tail->val)
     {
      tail =tail->next;
      while (tail)//查找重复的结点
      {
       if (cur->val != tail->next)
       break;
       tail = tail->next;
      }
      while (cur != tail)//删除重复的结点,不能直接删除cur,cur的位置还需要标记。
      {
       ListNode *ptmp = cur;
       cur = cur->next;
       free (ptmp);
      }
      if (prev == NULL)
      {
       pHead = tail;
      }
      else
      {
       prev->next = tail;
      }
      if (tail)
      {
        tail = tail->next;//开始下一轮重复值得查找。
      }
    }
  else
  {
   prev = cur;
   cur = tail;
   tail = tail->next;
  }
 }
  return pHead;
}
  • 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

     测试样例:
     1->2->2->1
     返回:true
    
ListNode *ListReverse (ListNode *head)
{
 ListNode *prev = NULL;
 ListNode *cur = head;
 ListNode *tail = NULL;
  while (cur)
  {
   tail = cur->next;
   cur->next = prev;
   prev = cur;
   cur = tail;
  }
  return prev;//一定要返回新链表的头结点。
}

bool chkPalindrome(ListNode* head)
{
  ListNode *fast = head;
  ListNode *slow = head;
  while (fast && fast->next)//寻找中间结点的位置。
  {
   fast = fast->next->next;
   if (fast)
   slow = slow->next;
  }
  ListNode *Listlater = slow->next;
  slow->next = NULL;
  ListNode *Listbefer = head;
  Listlater = ListReverse(Listlater);
  while (Listbefer && Listlater)
  {
   if (Listbefer != Listlater)
   {
    return false;
   }
   else
   {
    Listbefer = Listbefer->next;
    Listlater = Listlater->next;
   }
  }
 return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值