代码随想录算法训练营第3天| 203. 移除链表元素、707. 设计链表、206. 反转链表

本文分享了解决LeetCode中链表问题的经验,包括移除元素时的头指针处理、循环条件调整以及设计链表时的理解。强调了正确定义头指针和避免多余条件的重要性。

203. 移除链表元素

203. 移除链表元素 - 力扣(LeetCode)

思路

核心的题解部分是懂的,只是细节没处理好导致没做出来!

首先是:定义头指针的时候没有用new开辟新的空间再赋值,这与将已有的空间重命名 是不一样的!(即下面的定义dummydead(需要开辟新地址) 和定义cur(相当于重命名而已)本质就是不一样的,要注意区别!)!

其次是:循环条件处不需要加上cur->next->next的判断,否则将判断不了最后一个元素!

最后是:return之前要记得return的是head,然后要释放dummyhead !

本人题解

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //一般给出的链表是没有头指针的,因此我们需要定义一个头指针(即虚拟头节点)
        //ListNode* dummyHead(0);//错误的定义方式!!!!!!!!
        ListNode *dummyHead = new ListNode(0);
        if (head != NULL) dummyHead->next = head;//将头节点的地址赋值给头指针才算完成        
        //移除某一个节点元素必须通过上一个节点进行,还要保留下一个节点的地址
        ListNode* cur = dummyHead;
        //此处不能加上&& cur->next->next != nullptr这个条件,否则最后一个不能判断
        while (cur->next != nullptr ) {
            //单层循环:
            ListNode* p = cur->next;//p用于保留要删除的节点,然后释放掉
            if (p->val == val) {
                cur->next = cur->next->next;
                delete p;
            }
            else {
                cur = cur->next;
            }
            
        }
        //return dummyHead->next;//值得注意的点
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

707. 设计链表 

题目链接 

707. 设计链表

思路

看完这道题想上手的时候,感觉跟之前做的“直接给出链表的定义,然后我直接开辟新空间进行操作” 这种方式不一样,也就是说:我不知道初始化的是哪个val和哪个next指针。

206. 翻转链表

题目链接

206. 反转链表 - 力扣(LeetCode)

思路 

应该熟记 先保存再翻转 的原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值