每日一练之移除链表元素

题目:

画图解析:

方法:双指针

解答代码(注:解答代码带解析):

cpp 复制代码
//题目给的结构体
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode  ListNode;
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;
}

建议动手敲一敲!!

上面的代码是老师教的,下面分享我写的,我自己写的代码时间复杂度太高了,不建议模仿。

本人自己写的代码:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode  ListNode;
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)
    {
        return  NULL;
    }
    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;
}

完!!

相关推荐
liang_jy3 小时前
数组(Array)
数据结构·面试·trae
要做朋鱼燕4 小时前
【数据结构】用堆解决TOPK问题
数据结构·算法
秋难降5 小时前
LRU缓存算法(最近最少使用算法)——工业界缓存淘汰策略的 “默认选择”
数据结构·python·算法
Jayyih7 小时前
嵌入式系统学习Day19(数据结构)
数据结构·学习
DdduZe8 小时前
8.19作业
数据结构·算法
PyHaVolask8 小时前
链表基本运算详解:查找、插入、删除及特殊链表
数据结构·算法·链表
1白天的黑夜19 小时前
链表-2.两数相加-力扣(LeetCode)
数据结构·leetcode·链表
花开富贵ii9 小时前
代码随想录算法训练营四十六天|图论part04
java·数据结构·算法·图论
熬了夜的程序员10 小时前
【LeetCode】16. 最接近的三数之和
数据结构·算法·leetcode·职场和发展·深度优先
Miraitowa_cheems10 小时前
LeetCode算法日记 - Day 15: 和为 K 的子数组、和可被 K 整除的子数组
java·数据结构·算法·leetcode·职场和发展·哈希算法