循环链表

循环链表:循环链表的尾结点指向的是头节点的地址,如图:

这里写图片描述

那么我们需要注意的是:与单链表的不同,单链表的结点最后一个节点指向的是NULL;基本的插入,删除,毁坏,清除函数只是在遍历的时候不一样。
如果只是遍历链表,那么循环代码 for(CNode *p=clist;p->next!=clist;p=p->next);
如果只是遍历链表中的数据,那么循环代码 for(CNode *p=clist->next;p!=clist;p=p->next);

循环链表的常见面试题:
1、给定单链表,检测是否有环 bool AnyCycle。
2、 给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。

  特点,最后一个节点都是NULL,如果返回值为NULL,表示无交点。

3、只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点。

4、只给定单链表中某个结点p(非空结点),在p前面插入一个结点

5、给定单链表头结点,删除链表中倒数第k个结点。
那我们一起讨论一下吧:

1、给定单链表,检测是否有环 bool AnyCycle
思想:检测是否有环,其实就是看这个链表是不是循环链表,还记得我们小时候玩过的丢手绢吗?大家围成一个圈,一个人拿着手绢在前面跑,另一个人在后面追,当跑的快的人顺着她跑的方 向撞到了后面追的人,是不是就证明他们刚才是围着一个圈在跑,对吧。
如果你想到这个小时候的游戏了,那么就很容易解决这个问题了。
(1)定义两个指针,分别是走的快的指针,和走的慢的指针;
(2)遍历链表,快指针追上慢指针时,有环
(3)当快指针==NULL,无环
2、给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。

特点,最后一个节点都是NULL,如果返回值为NULL,表示无交点。

思想:检测两个链表是否有交点,而且返回第一个交点,这是怎么回事呢?

这里写图片描述

解法一:最直观的就是,先判断第一个链表的每一个节点是否在第二个链表中,这样时间复杂度为O(length1*length2);
解法二:如果假设两个链表都没有环,我们可以把第二个链表接在第一个链表后面,如果得到的链表有环,则说明这两个链表相交,否则,这两个链表就不相交。这样,其实判断一个链表是否有环?
如果有环,那么第二个链表的表头一定在环上,我们只需要从第二个链表开始遍历,看是否可以回到起始点就可以判断出来。
解法三:如果两个没有环的链表相交于某一结点的话,那么在这一个结点之后的所有节点都是共有的。如果它们相交,那么最后一个节点是共有的。

3、只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点
思想:要删除这个节点,只能无耻的采用一种方法,删掉数据,指针 指向不变

4、 只给定单链表中某个结点p(非空结点),在p前面插入一个结点
思想:先在p后面插入结点,然后数据域是p结点的数据域,也就是说换了一下数据,因为也没人知道数据在内存中是怎么存的,对吧?我们达到结果就好了呗

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值