每日一题算法——移除链表元素、反转链表

移除链表元素

力扣题目链接

我的解法:

注意细节:要删掉移除的元素。

c++ 复制代码
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while(head!=nullptr){
            if(head->val==val){
                head=head->next;
            }
        }
        ListNode* nowhead = head;
        while(nowhead){
            
            if(nowhead->next->val == val){
                if(nowhead->next->next == nullptr){
                    nowhead->next =nullptr;
                }else{
                    nowhead->next=nowhead->next->next;
                }
                
            }
            nowhead = nowhead->next;
        }
        return head;
    }
};

//修改后
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while(head != NULL && head->val==val){
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }
        ListNode* nowhead = head;
        while(nowhead !=NULL && nowhead->next !=NULL ){
            
            if(nowhead->next->val == val){
                    ListNode* tmp=nowhead->next;
                    nowhead->next=nowhead->next->next;
                    delete tmp;
                }else{
                     nowhead = nowhead->next;
                }
                
        }
        return head;
        
    }
};

方法二:

增加一个伪头结点dummyhead,dummyhead->next = head;

这样可以统一头结点和后续节点的删除方式。

c++ 复制代码
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {

        ListNode* dummyhead = new ListNode(0);\\记得定义
        dummyhead->next =head;
        ListNode* nowhead =dummyhead;
        while(nowhead !=NULL && nowhead->next !=NULL ){
            
            if(nowhead->next->val == val){
                    ListNode* tmp=nowhead->next;
                    nowhead->next=nowhead->next->next;
                    delete tmp;
                }else{
                     nowhead = nowhead->next;
                }
                
        }
        return dummyhead->next;
        
    }
};

反转链表

力扣题目链接

c++ 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = nullptr;
        ListNode* cur = head;
        while(cur!=nullptr){
            ListNode * tmp = cur->next;
            cur->next =prev;
            prev =cur;
            cur =tmp;
        }
        return prev;
    }
};
相关推荐
kk”2 分钟前
二叉树的顺序结构及实现
c语言·数据结构
爱是小小的癌23 分钟前
[第十六届蓝桥杯 JavaB 组] 真题 + 经验分享
经验分享·算法·蓝桥杯
自由鬼2 小时前
AI当前状态:有哪些新技术
人工智能·深度学习·算法·ai·chatgpt·deepseek
奋进的小暄2 小时前
贪心算法(20)(java)整数替换
开发语言·算法
天天扭码3 小时前
一分钟解决 | 高频面试算法题——和为 K 的子数组(前缀和)
前端·算法·面试
ChoSeitaku3 小时前
NO.97十六届蓝桥杯备战|数论板块-最大公约数和最小公倍数|欧几里得算法|秦九韶算法|小红的gcd(C++)
c++·算法·蓝桥杯
努力也学不会java3 小时前
【Redis】Redis中的常见数据类型(一)
数据结构·数据库·redis·缓存·bootstrap
椰萝Yerosius3 小时前
[图论]Prim
算法·图论
Yasen^o3 小时前
go-map+sync.map的底层原理
算法·哈希算法