链表的基础和一些提升

如果你是萌新的话,建议先去把c语言书上的指针和结构体先去学,不然会听不明白,书上的东西讲得很详细。

struct student{
    long num;
    float score;
    struct student*next;
};
//定义一个结构体,同时定义一个结构体指针指向第下一个结构体,完成连接。

链表要有head(头)指针!!!!

struct student *head;
struct student *p1,p2;
head=NULL;//将头指针变成空指针

剩下的一些基础建议自己去看书,书上讲得比我好-----。

后面内容是书上没有的,感兴趣的可以看看!

1、环形链表

你需要判断你的链表中是否有环形链表。

仔细思考!

你可以想想龟兔赛怕,如果赛道是环形的,那么兔子和乌龟一定可以相遇,否则就无法相遇。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        struct ListNode*fast=head;
        struct ListNode*slow=head;//用2个指针分别表示兔子和乌龟
        while(fast&&fast->next)//这个意思是fast指针不是空,fast后面的也不为空
        {
            fast=fast->next->next;
            slow=slow->next;
            if(slow==fast)break;//相遇则退出循环
        }
        if (fast==NULL||fast->next==NULL)//判断是否有环
        return NULL;
        //有环由上可以推出快比慢多走了环长的1倍
        //这个时候,继续前进到入环口的距离 与 起点走到入环口的距离恰好相等
        fast=head;
        while(fast!=slow)
        {
            slow=slow->next;
            fast=fast->next;
        }
        return fast;
    }
};

这是双指针的应用,可以去找一些题目练手。

// Initialize slow & fast pointers
ListNode* slow = head;
ListNode* fast = head;
/**
 * Change this condition to fit specific problem.
 * Attention: remember to avoid null-pointer error
 **/
while (slow && fast && fast->next) {
    slow = slow->next;          // move slow pointer one step each time
    fast = fast->next->next;    // move fast pointer two steps each time
    if (slow == fast) {         // change this condition to fit specific problem
        return true;
    }
}
return false;   // change return value to fit specific problem
这个是模板,快慢指针!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值