学习笔记--链表8.14

83. 删除排序链表中的重复元素

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
    if(!head||!head->next) return head;//!!每次都不加边界条件啊啊啊啊啊!
        ListNode* p=head;
        while(p&&p->next){
            if(p->val==p->next->val){p->next=p->next->next;}
            else p=p->next;
        }
        return head;
    }
};

141. 环形链表

在这里插入图片描述

//快慢指针的用法
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(!head||!head->next) return false;
        ListNode*p=head;
        ListNode*q=head;
        while(q&&q->next)//判断快的就可以了!
        {          
            q=q->next->next; 
            p=p->next;
            if(q==p)return true;    
        }
        return false;
    }
};

160. 相交链表

在这里插入图片描述
只会用暴力法如下

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode*pa=headA;
        while(pa)
        {
            ListNode*pb=headB;
            while(pb)
            {
                if(pb==pa) return pb;
                pb=pb->next;
            }
            pa=pa->next;

        }
       return pa;
    }
};

在这里插入图片描述

然后看题解学会了这个双指针法使得两个到达相同的长度再开始判断
在这里插入图片描述

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode*a=headA,*b=headB;
        while(a!=b){
            a=(a==NULL)?headB:a->next;
            b=(b==NULL)?headA:b->next;
        }
        return a;
    }
};

在这里插入图片描述

203. 移除链表元素

在这里插入图片描述
point:考虑开头连续删除好几个节点的情况
方法一:标准答案:
在这里插入图片描述

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode*dummy=new ListNode(0);
        dummy->next=head;
        ListNode* p=dummy;//加了dummy之后不需要考虑头结点需要删除的特殊情况
        while(p&&p->next)
        {
            if(p->next->val==val)
            {
                auto tmp=p->next->next;
                delete p->next;
                p->next=tmp;
            }
            else p=p->next;
        }
        return dummy->next;
    }
};

在这里插入图片描述

方法二:如果要单独考虑头结点的话如下(感谢小刘鸭同学的悉心解答!我明白辽!)

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while(head&&head->val==val)head=head->next;
        ListNode*p=head;
        while(p&&p->next){
            if(p->next->val==val)p->next=p->next->next;
            else p=p->next;
        }
        return head;
    }
};

在这里插入图片描述

206. 反转链表

在这里插入图片描述
方法一:迭代
在这里插入图片描述

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode*cur=head,*pre=NULL;
        while(cur){
            auto tmp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=tmp;
        }
        return pre;
    }
};

方法二:递归(看了好久才懂但是下一次一定不会写!)

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==NULL||head->next==NULL) return head;
        ListNode*p=reverseList(head->next);
        head->next->next=head;
        head->next=NULL;
        return p;
    }
};

ps:刘老师的解答
刘老师的思路确实非常清晰!
递归到p=head到3以后开始回溯(谢谢刘老师!)

summary

1.对边界条件的考虑:
head==NULL等;
2.对特殊情况的考虑:
对head的删除使得头结点缺失或链表为空—>引用辅助指针:
Node* dummy=new Node(0);
3.加强对递归的学习

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值