关键词搜索

源码搜索 ×
×

链表典例二

发布2022-03-23浏览868次

详情内容

三:链表的中间结点

基本思路:1)因为链表非空,所以不用断言

2)使用快慢指针为最优解,定义两个指针fast 和 slow

fast一次走两步,slow一次走一步。

3)分情况

i若链表长度为奇数时

此时返回slow即为所求

ii若为偶数时

可见,当fast指向为空时,slow的位置即为所求。

代码展示

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* middleNode(struct ListNode* head){
  9. struct ListNode* slow,*fast;//创建快慢指针
  10. slow = fast = head;//指向的都是头节点
  11. while(fast && fast->next)//这里注意fast必须在前,
  12. //因为根据&&的性质,前面为假,后面的就不看了,fast在后就会使得为奇数的情况报错
  13. {
  14. slow = slow->next;//slow一次前进一个
  15. fast = fast->next->next;//fast前进两个
  16. }
  17. return slow;//slow所指的即为所求
  18. }

四:链表中倒数第k个节点

基本思路:1)如果链表为空,那就返回NULL

2)创建快慢指针,但快指针先走k步,之后快慢指针一起移动,那么,终止循环的条件是fast==NULL

3)如果给定的k值超过了链表的长度,会使得fast成为野指针,所以要判断fast是否在先走的情况下成为野指针。

画图:

代码展示:

  1. struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
  2. // write code here
  3. struct ListNode* slow,*fast;//创建快慢指针
  4. slow = fast = pListHead;//指针初始指向头节点
  5. while(k--)//fast先走k步
  6. {
  7. if(fast == NULL)//给定的k的值超过了链表的长度
  8. {
  9. return NULL;//返回NULL
  10. }
  11. fast = fast->next;//更新fast
  12. }
  13. while(fast)//fast为空结束循环
  14. {
  15. slow = slow->next;
  16. fast = fast->next;//fast和slow都走一步
  17. }
  18. return slow;//返回slow节点
  19. }

因为这两个题都应用到了快慢指针,但实现的技巧不一样,所以单独写一篇博客,后续还有链表其他方向的典例,后续会陆续推出。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载