每日一练之移除链表元素

打印 上一主题 下一主题

主题 1033|帖子 1033|积分 3099

题目:
   

  画图解析:
   

  方法:双指针
解答代码(注:解答代码带解析):
  1. //题目给的结构体
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. *     int val;
  6. *     struct ListNode *next;
  7. * };
  8. */
  9. typedef struct ListNode  ListNode;
  10. ListNode* removeElements(struct ListNode* head, int val) {
  11.     ListNode* newHead, * newTail;
  12.     newHead = newTail = NULL;
  13.     ListNode* pcur = head;
  14.     while (pcur)
  15.     {
  16.         if (pcur->val != val)
  17.         {
  18.             if (newHead == NULL)//链表的头结点没有找到
  19.             {
  20.                 newHead = newTail = pcur;//找到新的链表的头结点newHead,这个头结点后面要传回去,不能动。
  21.             }
  22.             else//找到头结点之后这时候newHead和newTail都在头结点
  23.             {
  24.                 newTail->next = pcur;//先存储pcur的地址
  25.                 newTail = newTail->next;//再走下一步
  26.             }
  27.         }
  28.         pcur = pcur->next;//无论怎么样pcur都要走下一步,找到要移除的元素直接跳过就行
  29.     }
  30.     if (newTail)//这时候pcur=NULL;但是newTail->next没有改为NULL,链表不完整
  31.     {
  32.         newTail->next = NULL;
  33.     }
  34.     return newHead;
  35. }
复制代码
发起动手敲一敲!!
上面的代码是老师教的,下面分享我写的,我自己写的代码时间复杂度太高了,不发起模仿。
本人自己写的代码:
  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. *     int val;
  6. *     struct ListNode *next;
  7. * };
  8. */
  9. typedef struct ListNode  ListNode;
  10. ListNode* removeElements(struct ListNode* head, int val) {
  11.     ListNode* newHead, * newTail, * phead;
  12.     if (head == NULL)
  13.     {
  14.         return head;
  15.     }
  16.     phead = head;
  17.     while (phead)//找新的头结点
  18.     {
  19.         if (phead->val != val)
  20.         {
  21.             newHead = phead;//只要不是移除元素,这个结点就是新的头结点,找到马上跳出循环
  22.             break;
  23.         }
  24.         phead = phead->next;
  25.     }
  26.     if (phead == NULL)
  27.     {
  28.         return  NULL;
  29.     }
  30.     newTail = phead = newHead;
  31.     while (phead)
  32.     {
  33.         if (phead->val != val)
  34.         {
  35.             newTail = phead;
  36.             phead = phead->next;
  37.         }
  38.         else
  39.         {
  40.             ListNode* del = phead;
  41.             phead = phead->next;
  42.             newTail->next = phead;
  43.             free(del);
  44.             del = NULL;
  45.         }
  46.     }
  47.     return newHead;
  48. }
复制代码
完!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表