代码随想录算法训练营第三天

206、反转链表

注意点:一定要注意空指针的判断条件,不能存在一个节点本身已经就是空节点的情况还仍然对其进行.next的运算,这样的话会导致编译不通过。PS:这种情况如果没有考虑但是代码在某些刷题网站上仍能编译运行,希望能改正

代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr || head->next == nullptr)
        return head;
        auto p = head;
        auto cur = head->next;
        auto nxt = cur->next;
        
        while(cur != nullptr)
        {
            cur->next = p;
            p = cur;
            cur = nxt;
            if(nxt != nullptr)//此处需要注意,不然会出现前面说的情况导致无法编译
            nxt = nxt->next;
        }
        head->next = NULL;
        return p;
        
    }
};

707、设计链表

总结:这个题目最好是设置一个虚拟头节点来做会很方便,但是我更认为有一个变量来记录链表大小更妙,自己的想法是在有需要用到Index的地方再额外设置一个count变量,来记录下标,这样做也行,就是没有设置一个链表大小size变量再进行减减操作方便,自己也没弄清头节点和后续节点的关系导致删除操作一直有问题,最后一直绕不出来还是选择了答案。

答案:代码随想录

203、移除链表元素

总结:一开始还以为只需要几行代码就能完成,结果发现还有一些特殊情况还是不能排除,结果还是要多思考,中间有个需要注意的点就是要注意到如果当前节点的下一节点的值等于目标值的话进行移除后不要有将当前的cur节点往后移的操作,否则如果有两个连续的目标值就无法消除。

代码:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head == nullptr)
        return nullptr;

        while(head != nullptr && head->val == val)
        {
            auto temp = head;
            head = head->next;
            delete temp;
        }

        auto cur = head;
        while(cur != nullptr && cur->next != nullptr)
        {
            if(cur->next->val == val)
            {
                auto temp = cur->next;
                cur->next = cur->next->next;
                
                delete temp;
            }
            else
            {
                cur = cur->next;
            }
        }
        return head;
    }
};

你可能感兴趣的:(算法)