西河刘卡车医 发表于 2025-3-12 12:08:53

每日一练之移除链表元素

题目:
   https://i-blog.csdnimg.cn/direct/427299b587be4bcd849f7a02f3959948.png
画图解析:
   https://i-blog.csdnimg.cn/direct/7fc052fea9b74f3f9aca2b630ebde4f6.png
方法:双指针
解答代码(注:解答代码带解析):
//题目给的结构体
/**
* Definition for singly-linked list.
* struct ListNode {
*   int val;
*   struct ListNode *next;
* };
*/
typedef struct ListNodeListNode;
ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* newHead, * newTail;
    newHead = newTail = NULL;
    ListNode* pcur = head;
    while (pcur)
    {
      if (pcur->val != val)
      {
            if (newHead == NULL)//链表的头结点没有找到
            {
                newHead = newTail = pcur;//找到新的链表的头结点newHead,这个头结点后面要传回去,不能动。
            }
            else//找到头结点之后这时候newHead和newTail都在头结点
            {
                newTail->next = pcur;//先存储pcur的地址
                newTail = newTail->next;//再走下一步
            }
      }
      pcur = pcur->next;//无论怎么样pcur都要走下一步,找到要移除的元素直接跳过就行
    }
    if (newTail)//这时候pcur=NULL;但是newTail->next没有改为NULL,链表不完整
    {
      newTail->next = NULL;
    }
    return newHead;
} 发起动手敲一敲!!
上面的代码是老师教的,下面分享我写的,我自己写的代码时间复杂度太高了,不发起模仿。
本人自己写的代码:
#define _CRT_SECURE_NO_WARNINGS 1
/**
* Definition for singly-linked list.
* struct ListNode {
*   int val;
*   struct ListNode *next;
* };
*/
typedef struct ListNodeListNode;
ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* newHead, * newTail, * phead;
    if (head == NULL)
    {
      return head;
    }
    phead = head;
    while (phead)//找新的头结点
    {
      if (phead->val != val)
      {
            newHead = phead;//只要不是移除元素,这个结点就是新的头结点,找到马上跳出循环
            break;
      }
      phead = phead->next;
    }
    if (phead == NULL)
    {
      returnNULL;
    }
    newTail = phead = newHead;
    while (phead)
    {
      if (phead->val != val)
      {
            newTail = phead;
            phead = phead->next;
      }
      else
      {
            ListNode* del = phead;
            phead = phead->next;
            newTail->next = phead;
            free(del);
            del = NULL;
      }
    }
    return newHead;
}
完!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 每日一练之移除链表元素