day3链表

题目:

https://leetcode.cn/problems/remove-linked-list-elements/submissions/537974263/
题目解析:
https://programmercarl.com/0203.移除链表元素.html

这道题用了dummyHead,会简单非常多,但是需要注意的是,如果不用dummyHead的话,去除head为啥使用while而不是if呢?
个人理解是,可能会出现很多个连续的符合val值的节点,这样的话只用if就只删除了一个,而用while的话可以尽数删除。

此外cur是一个指针,它指向某个节点,从而可以改变这个节点的指向,并且绝大多数题目都是cur驱动的,使用

while(cur!= null)或
while(cur)

这里的区别是如果使用cur!=则最终的指针是指向最后一个节点,而使用cur的话最终是指向null;

题目:

https://leetcode.cn/problems/design-linked-list/
题目解析:
https://programmercarl.com/0707.设计链表.html#思路
这里是一个类,包括构造函数,private和public;
值得注意的是

void deleteAtIndex(int index) {
        if (index >= _size || index < 0) {
            return;
        }
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur ->next;
        }
        LinkedNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
        //delete命令指示释放了tmp指针原本所指的那部分内存,
        //被delete后的指针tmp的值(地址)并非就是NULL,而是随机值。也就是被delete后,
        //如果不再加上一句tmp=nullptr,tmp会成为乱指的野指针
        //如果之后的程序不小心使用了tmp,会指向难以预想的内存空间
        tmp=nullptr;
        _size--;
    }

这段的tmp = nullptr我个认为是不需要的,作用域结束后会把tmp销毁掉,但是显示指出可能才是大佬的风格把,以后也可以注意把此类指针显示设置为nullptr,养成好习惯。

题目:

https://leetcode.cn/problems/reverse-linked-list/submissions/537978356/
题目解析:
https://programmercarl.com/0206.翻转链表.html#算法公开课
这道题就是可以指向null的推进方式,与其说它是双指针,不如认为是三指针,它推动的方式是使用cur,但是其实是通过tmp来确定移动的方向,
而采用pre = cur可以保证pre指针一直在cur前一个。因此是cur是动力源,而pre和tmp都作为锚定点来标明前一个和后一个节点。
因为cur最终是在null,因此返回值得是pre。

posted @ 2024-06-07 22:17  zhangenigma  阅读(21)  评论(0)    收藏  举报