C语言每日一题:9.《数据结构》链表的中间节点+链表的倒数第k个节点。

文章提供了两种方法来解决链表问题:一是通过遍历计算找到链表的中间节点;二是使用快慢指针寻找链表中的倒数第k个节点。在寻找中间节点时,涉及到了链表长度的计算和指针同步移动;在找倒数第k个节点时,特别考虑了链表长度与k的关系以及边界情况的处理。
摘要由CSDN通过智能技术生成

第一题:

请添加图片描述
题目链接:

>思路一:

1.第一遍遍历链表,直到找到尾结束第一次遍历,遍历的过程中记录链表长度。定义长度为k。
2.确定中间是第几个节点,计算是k/2+1根据题目要求。
3.再一次去遍历我们的数组,找到中间节点,返回节点。

>思路二:

使用了一个快慢指针的思想。
1.定义一个慢指针和一个快指针。
2.v快=2v慢,同起到,时间时间是时刻相同。
3.x快=2x慢。当快指针走到尾的时候慢指针才走到中间。

struct ListNode* middleNode(struct ListNode* head){
        struct ListNode* quic=head,*slow=head;
        //判断奇数,判断偶数.两个条件满足一个就结束。
        while((quic) && (quic->next))
        {
            slow=slow->next;
            quic=quic->next->next;
        }
        return slow;
}

第二题:

请添加图片描述
题目链接:

>思路一

1.第一遍遍历链表,直到找到尾结束第一次遍历,遍历的过程中记录链表长度。定义长度为n
2.确定倒数第k个是正数第n-k个
3.再一次去遍历我们的数组,找到倒数第k个,返回节点。

>思路二

1.相对距离的使用,定义一个前面的指针和后指针,初始都是在头节点。
2.先循环遍历后指针k让后指针向后移动k次,前后指针再用相同的速度向后同时移动,当后指针为空时就结束,这个时候的前指针就是倒数第k个节点。
请添加图片描述
3.特殊情况:
1.一共k个节点倒数第k个就是第一个节点。循环结束n1,ffastNULL;判断n1返回头就可以。
2.节点为空,链表没有数据直接返回空在开始就判断。
3,n
0和fast!=NULL,说明我们的接下来的双指针移动没有问题可以正常进行。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    //对于一个链表来说应该开始就判断是否为空链表。
    if(pListHead==NULL)
    {
        return NULL;
    }
    struct ListNode* fast=pListHead,*slow=pListHead;
    int n=k;
    //位置差搞出来
    while(n&&fast->next!=NULL)
    {
        fast=fast->next;
        n--;
    }

    //一共只有k个节点的情况,倒数第k个就是头
    if(n==1)
    {
        return pListHead;
    }
    //循环找第k个节点的时候没有超出链表的范围,前后的指针都是正常的。
    if(n==0)
    {
            while(fast!=NULL)
        {
            slow=slow->next;
            fast=fast->next;
        }
         return slow;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值