数据结构OJ题——移除链表元素

Posted GreenHandXJT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构OJ题——移除链表元素相关的知识,希望对你有一定的参考价值。

方法一:在原链表的基础上遍历

struct ListNode* removeElements(struct ListNode* head, int val)
{
        while (head != NULL && head->val == val) {
            head = head->next;
        }

        if (head == NULL) {
            return NULL;
        }

        struct ListNode* pre = head;
        while (pre->next != NULL) {
            /* 找到值为 val 的节点并删除 */
            if (pre->next->val == val) 
            {
                pre->next = pre->next->next;   
            }
            else 
            {
                 /*没找到继续遍历寻找 */
                pre = pre->next;
            }
        }
        return head;
}

下面两幅图是我在平板上写的对极端情况的思考(这个地方很容易出错),以及对

  while (pre->next != NULL) {
            /* 找到值为 val 的节点并删除 */
            if (pre->next->val == val) 
            {
                pre->next = pre->next->next;   
            }

这段代码的理解(这段代码非常的秒,有很多的妙用).

方法二:重新创建一个空链表,进行尾插

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* newnode=NULL;
    while(head!=NULL&&head->val==val)
    {
        head=head->next;
    }
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode*cur=head;
    newnode=cur;
    struct ListNode* tail=cur;
    while(cur->next)
    {
         if(cur->next->val==val)
         {
            cur->next=cur->next->next;   //cur=cur->next->next;//前面一种写法就可以巧妙的避免连续2个6的情况,而后面的写法不能
         } 
         else
         {
             cur=cur->next;
             tail->next=cur;
             tail=tail->next;
         }
    }
    tail->next=NULL;
    return head;
}  

这段代码要注意的就是最后结束了,一定不要忘了把tail->next赋值为空

总结对比

方法一的思路比较容易想到,一个个遍历过去,是的就保留,不是的就销毁(也可以不销毁,如代码中一样,直接跳到下下个节点去),不过这段代码写的时候很讲究写法和技巧,写法不好的话,考虑的情况就很多,而且很复杂,再加上这段代码的细节也很多,很容易出错;方法二,代码没有太多的细节,写起来简单,但思路不容易想到。总的来说,在写这种考你逻辑能力的oj题时,一定要多画图,画图时要想好每一步以及下一步应该怎么走,这中间也要把一些极端情况考虑进去.

以上是关于数据结构OJ题——移除链表元素的主要内容,如果未能解决你的问题,请参考以下文章

链表oj----移除链表元素

数据结构学习笔记(数组链表OJ题)整理与总结

数据结构学习笔记(数组链表OJ题)整理与总结

数据结构之超硬核热门复杂度数组链表OJ题2W+文字+图片详解

2021/6/5 刷题笔记移除链表元素

八道经典的面试链表题--------快乐人的java巩固日记[1]